1 Introducción


1.1 Presentación.

El presente documento tiene como propósito cubrir los objetivos establecidos en el TFM del Área 3 del Máster Universitario en Ciencia de Datos (Data Science) asociado y que tiene por título: Segmentación del estudiantado universitario: el caso de la Udima.

1.2 Objetivo.

Para contextualizar el mismo, se establecen el objetivo general y los objetivos específicos del proyecto, atendiendo a los principios de ser claros, concisos, medibles, alcanzables, relevantes y planificables.

Objetivo general:

El objetivo del proyecto es conocer las características del estudiantado que finalizan o abandonan una titulación universitaria en la Universidad a Distancia de Madrid, en adelante Udima, en base a su rendimiento académico, opiniones manifestadas, características sociodemográficas y de comportamiento Moodle, el LMS (Learning Management System) utilizado para el proceso de enseñanza-aprendizaje. De esta forma, también se pretende identificar qué proporción del estudiantado egresado o que abandona la universidad corresponde a cada tipo para poder predecir qué tipo son los estudiantes que no han finalizado sus estudios, con especial interés, en los que están en riesgo de abandono.


2 Ciclo de vida del proyecto según la metodología CRISP-DM.


A continuación se detallan las fases del ciclo de vida del proyecto según la metodología CRISP-DM (Cross Industry Standard Process for Data Mining) a aplicar en el presente TFM.

2.1 Fase I. Business Understanding o definición de necesidades.

Como se ha comentado en el apartado anterior, el objetivo del proyecto es conocer las características del estudiantado que finalizan o abandonan una titulación universitaria en la Universidad a Distancia de Madrid, en adelante Udima, en base a su rendimiento académico, opiniones manifestadas, características sociodemográficas y de comportamiento Moodle, el LMS (Learning Management System) utilizado para el proceso de enseñanza-aprendizaje. De esta forma, también se pretende identificar qué proporción del estudiantado egresado o que abandona la universidad corresponde a cada tipo para poder predecir qué tipo son los estudiantes que no han finalizado sus estudios, con especial interés, en los que están en riesgo de abandono.

Este objetivo se puede resolver mediante minería de datos a través del establecimiento de los siguientes objetivos específicos:

  • Identificar los perfiles del estudiantado que finaliza o abandona sus estudios. Para ello, se aplicarán métodos no supervisados basados en el concepto de distancia (métodos de agregación o análisis cluster).

  • Determinar las características principales que definen a un estudiante que finaliza o abandona sus estudios. Partiendo de la clasificación obtenida en el objetivo anterior, se obtendrán las características principales de cada grupo según las estadísticas básicas de las variables.

  • Predecir la clasificación de los estudiantes que no han finalizado los estudios. Para llevarlo a cabo se aplicarán técnicas de aprendizaje supervisado y se utilizará el algoritmo de clasificación que aporte mejores resultados. Para determinar el mejor modelo se aplicará validación cruzada.

Tanto el objetivo principal como los objetivos específicos justifican la utilización de los datos del proyecto, para lo cual, se deben obtener y tratar previamente a partir de las distintas bases de datos disponibles.

# Se cargan las librerías

# carga de datos
if (!require('readxl')) install.packages('readxl'); library('readxl')
if (!require('xlsx')) install.packages('xlsx'); library('xlsx')


# transformación datos
if (!require('tidyr')) install.packages('tidyr'); library('tidyr')
if (!require('tidyverse')) install.packages('tidyverse'); library('tidyverse')
if (!require('reshape2')) install.packages('reshape2'); library('reshape2')
if (!require('fastDummies')) install.packages('fastDummies'); library('fastDummies')
if (!require('scales')) install.packages('scales'); library('scales')


# análisis de datos

    # correlaciones
    if (!require('PerformanceAnalytics')) install.packages('PerformanceAnalytics'); library('PerformanceAnalytics')
    if (!require('sjPlot')) install.packages('sjPlot'); library('sjPlot')
    
    # PCA
    if (!require('stats')) install.packages('stats'); library('stats') # método 1
    if (!require('factoextra')) install.packages('factoextra'); library('factoextra') # método 2
    if (!require('FactoMineR')) install.packages('FactoMineR'); library('FactoMineR') # método 3

    # cluster
    if (!require('cluster')) install.packages('cluster'); library('cluster')
    if (!require('NbClust')) install.packages('NbClust'); library('NbClust')
    if (!require('clValid')) install.packages('clValid'); library('clValid')

    # prediction cv
    if (!require('caret')) install.packages("caret"); library('caret')
    if (!require('caTools')) install.packages("caTools"); library('caTools')

    # knn
    if (!require('class')) install.packages("class"); library('class')

    # randomForest
    if (!require('randomForest')) install.packages("randomForest"); library('randomForest')


# mostrar datos
if (!require('summarytools')) install.packages('summarytools'); library('summarytools')
if (!require('DT')) install.packages('DT'); library('DT')



# ACCIONES IMPLEMENTADAS PARA ERROR AL INSTALAR LA LIBRERÍA summarytools 
# <stdin>:1:10: fatal error: Magick++.h: No existe el archivo o el directorio compilation terminated. -------------------------------------------------------------------- ERROR: configuration failed for package ‘magick’ * removing ‘/home/alejandra.bonilla/R/x86_64-pc-linux-gnu-library/4.2/magick’ Warning in install.packages :   installation of package ‘magick’ had non-zero exit status

# https://askubuntu.com/questions/1398876/magick-h-no-such-file-or-directory-even-after-installing-magick



# /usr/lib/R/etc/Makeconf:178: fallo en las instrucciones para el objetivo 'RcppExports.o'
# make: *** [RcppExports.o] Error 1
# ERROR: compilation failed for package ‘magick’
# * removing ‘/home/alejandra.bonilla/R/x86_64-pc-linux-gnu-library/4.2/magick’

# Terminal: apt-get install libmagick++-dev
# https://github.com/ropensci/magick/issues/270

# Term: sudo apt-get install r-base-dev libcurl4-openssl-dev libxml2-dev libssl-dev libmagick++-6.q16-dev
# https://askubuntu.com/questions/1287708/dependency-problems-installing-libmagick-dev-on-ubuntu-18-04

2.2 Fase II. Data Understanding o estudio y comprensión de los datos.

El objetivo de esta fase del proyecto es estudiar los datos disponibles para evitar problemas en fases posteriores. Para ello se debe recopilar, acceder, describir, explorar y verificar la calidad de datos. Estas tareas se realizan a continuación:

2.2.1 Tareas de ETL para obtener las bases de datos a utilizar.

Como el estudio analizará datos relativos al rendimiento académico, opiniones, características sociodemográficas y de comportamiento en la plataforma de estudio del estudiantado es necesario acceder y tratar distintas fuentes de datos. Se quiere perfilar a cada estudiante en función de variables que le definan, por lo que en esta fase es determinante seleccionar adecuadamente los niveles de agregación y las características a aplicar en las distintas fuentes de datos.

Los distintos datos se corresponden con:

  • Rendimiento académico:

    • Para poder clasificar a los estudiantes según su rendimiento es necesario contar con el progreso académico del estudiante desde que inicia los estudios, contando con la identificación de si egresa o abandona (aplica a los objetivos específicos 1 y 2).

    • Para poder predecir qué estudiantes se encuentran en riesgo de abandono es necesario contar con el progreso académico del estudiante desde que inicia los estudios hasta el momento actual (aplica al objetivo específico 3).

NOTA: Si el estudiante inicia sus estudios en una titulación que es sustituida por otra, debido a la extinción del plan de estudios inicial, los datos asociados al estudiante se tratarán de forma que se tenga un registro único y la adaptación al plan de estudios no afecte a su experiencia y progreso. Es decir, el registro de estos estudiantes se tratará para que se asocie al plan de estudios adaptado (o nuevo) y donde tendrá la posibilidad de egresar, pero incluyendo el rendimiento y curso de nuevo ingreso del plan de estudios inicial (o a extinguir).

  • Opiniones manifestadas: resultados de satisfacción e inserción laboral:

    • Para poder clasificar a los estudiantes o realizar predicciones sobre su riesgo de abandono se deben conocer las opiniones que manifiestan. Se recopilarán las valoraciones aportadas en las encuestas de asignaturas, curso, titulación o inserción laboral (aplica a todos los objetivos específicos establecidos).
  • Variables sociodemográficas:

    • Para poder clasificar a los estudiantes o realizar predicciones sobre sus características se deben conocer sus variables sociodemográficas y de comportamiento en la plataforma de estudio (aplica a todos los objetivos específicos establecidos).

El resultado final que se espera obtener después de estas tareas de ETL (Extract, Transform and Load) son dos bases de datos con la misma estructura y que:

  • contenga los datos del estudiantado que ha egresado o abandonado estudios (para acometer los objetivos específicos 1 y 2);

  • contenga los datos del estudiantado que se encuentra cursando estudios (para acometer el objetivo específico 3).

2.2.1.1 Recopilación de datos.

Previamente, para cada uno de los estudios: de satisfacción (estudiantes-asignaturas, estudiantes-curso, estudiantes-titulación); y de inserción laboral se ha construido un histórico de resultados comparado a partir de los resultados periódicos (semestrales o anuales) recogidos. La construcción del histórico de resultados tiene en cuenta:

  • las pequeñas variaciones que ha sufrido el formato del cuestionario a lo largo del tiempo. Para poder realizar un histórico comparado es necesario que todas las bbdd de los distintos periodos tengan la misma estructura. Es decir, si un ítem aparece en un período debe de existir esa misma variable en todos los periodos del histórico, recogiendo los valores correspondientes e incluyendo valores ausentes en los periodos que no se recogiese dicha información.

  • la codificación de las variables resume tres aspectos del ítem medido (concatenados mediante guión bajo “_“):

  1. el tipo de estudio al que pertenece el ítem (pudiendo variar entre: sa_asig, para la satisfacción del estudiantado con las asignaturas; sa_curso, para la satisfacción del estudiantado con el curso; sa_titulacion, para la satisfacción de egresados con la titulación; il_, para el estudio de inserción laboral de los egresados);

  2. el aspecto que mide, abreviación del ítem del cuestionario. Por ejemplo, organizacion para ‘La organización de la asignatura facilita el aprendizaje de esta asignatura’;

  • para cada estudio y período, existen dos tipos de ficheros (el primero, con la población a la que se invita a participar en el estudio y toda la relación de atributos asociados; y el segundo, con la muestra que participa en el mismo, las respuestas que aporta y los atributos asociados). En la construcción del histórico se cruzarán los ficheros de envío y respuesta para conocer el porcentaje de participación en el mismo así como todas las variables del cuestionario, aunque posteriormente no se estudien todas ellas en este proyecto (sí en otros). Para facilitar la fusión de ficheros se sigue el siguiente criterio: el fichero de población mantiene todos sus atributos así como la información relativa a la respuesta del mismo, el fichero de respuesta es simplificado al identificador único (atributo común al fichero de población, para permitir el cruce) y las respuestas a los ítems del cuestionario.

Estas tareas de construcción de los históricos comparados de los distintos estudios semestrales/anuales se realizan mediante los scripts:

  • 01_LeerFicherosHistoricoAsignatura_v02.R el cual finaliza con el guardado de una bbdd HistoricoAsignatura.Rda que contiene el histórico de resultados de satisfacción de los estudiantes con las asignaturas (estudio que inicia en 2008-09 pero que se almacena estructuradamente desde 2012-13).
  • 01_LeerHistorico_SA-E-CA.R el cual finaliza con el guardado de una bbdd Historico_SA_E_CA.Rda que contiene el histórico de resultados de satisfacción de los estudiantes con el curso (estudio que inicia en 2017-18).
  • 01_LeerFicherosHistoricoEgresados.R el cual finaliza con el guardado de una bbdd Historico_SA_EGRE.Rda que contiene el histórico de resultados de satisfacción de los egresados con la titulación (estudio que inicia en 2009-10).
  • 01_LeerFicherosHistoricoInsLab_v02.R el cual finaliza con el guardado de una bbdd HistoricoInsercionLaboral.Rda que contiene el histórico de resultados del estudio de inserción laboral de los egresados (estudio que inicia en 2009-10).

A modo ilustrativo, se incluyen fragmentos de uno de ellos (todos siguen la misma estructura), para que se puede comprobar la estructura general del script y la carga y fusión de datos para un periodo concreto:

  • se declara el objetivo del script, el directorio donde se va a trabajar, las librerías necesarias y el funcionamiento general del script;
# En este script se leen los diferentes ficheros de encuestas enviadas y recibidas al histórico del estudiantado-asignaturas
# y cargar en memoria un data frame con todos los datos de los ficheros combinados.
# Para facilitar el desarrollo se genera también un fichero con el data frame final de este script, para que pueda 
# ser leído directamente en siguientes ejecuciones en vez de llamar a este script. Así, si la parte de este script
# ya está revisada y los datos son correctos, para el desarrollo de las siguientes partes de generación de los informes
# podemos simplemente leer este fichero y evitar repetir los cálculos intermedios.


# 1. Establecemos el entorno y los directorios con los que vamos a trabajar
# para crear estos informes:
# Esta parte no hay que ejecutarla si se llama desde Generar_informes_profesores.R,
# toda esta información estará ya cargada en el entorno del script padre.


# Directorio donde se encuentran los ficheros a leer
vPathAsignatura = "/media/pluto/departamentos/calidad/1_UDIMA/Medición y Análisis/Histórico de resultados/SA-E: Satisfacción semestral de estudiantes/Resultados/"

# Estas librerías hay que cargarlas si ejecutamos el script de forma independiente,
library(dplyr)


# IMPORTANTE
# En cada csv de Enviadas se convierte en texto los campos: token, documento, id_gr_activ, dni_profe  
# En cada documento de Recibidas se convierte en texto el campo token y se sustituye " por '
  • cómo se carga el fichero de población, eliminando ciertas variables no relevantes, creando las que posteriormente aparecerán en otros estudios (con valores ausentes) y renombrando todos los atributos aplicando el criterio recién explicado;
####################################################################################################################
##############################                   Resultados 2016-17_2S                    #########################
####################################################################################################################

# Se cargan los datos de encuestas enviadas
asig_env_16172S = read.csv(paste0(vPathAsignatura,"SA_Específica_2016-17_2S_C1_Enviadas.csv"),
                           stringsAsFactors = FALSE,
                           na.strings = "NA",
                           colClasses=c("tid"="NULL",
                                        "emailstatus"="NULL",
                                        "language"="NULL",
                                        "validfrom"="NULL",
                                        "validuntil"="NULL",
                                        "invited"="NULL",
                                        "reminded"="NULL",
                                        "remindercount"="NULL",
                                        "attribute_11..id_grp_activ."="character"))

# Para facilitar la fusión con ficheros de semestres posteriores, se deben crear las columnas ausentes
asig_env_16172S$'vac_cen_codnum'='1'
asig_env_16172S$'prf_email'=NA
asig_env_16172S$'tas_codalf'=NA
asig_env_16172S$'tac_codalf'=NA

# Se renombran las variables para facilitar su identificación:
asig_env_16172S = asig_env_16172S %>% dplyr::rename(plan=attribute_1..plan.,
                                             expediente=attribute_2..expediente.,
                                             nombre_plan=attribute_3..nombre_plan.,
                                             codigo=attribute_4..codigo.,
                                             documento=attribute_5..documento.,
                                             fecha_nacimiento=attribute_6..fecha_nacimiento.,
                                             sexo=attribute_7..sexo.,
                                             asignatura=attribute_8..asignatura.,
                                             nombre_asignatura=attribute_9..nombre_asignatura.,
                                             gac_codnum=attribute_10..gac_codnum.,
                                             id_grp_activ=attribute_11..id_grp_activ.,
                                             nombre_profe=attribute_12..nombre_profe.,
                                             dni_prf=attribute_13..dni_prf.,
                                             prf_codnum=attribute_14..prf_codnum.,
                                             vac_codnum=attribute_15..vac_codnum.,
                                             gas_codnum=attribute_16..gas_codnum.,
                                             dur_codalf=attribute_17..dur_codalf.)
  • cómo se carga el fichero de respuestas, eliminando todos los atributos adicionales, renombrando las variables de los ítems y del identificador único (token) y creando las variables que posteriormente aparecerán en otros estudios (con valores ausentes);
# RECIBIDAS
# Se mantiene el identificador único y las respuestas al cuestionario, eliminando toda la información relativa a los atributos de cada registro
asig_rec_16172S = read.csv(paste0(vPathAsignatura,"SA_Específica_2016-17_2S_C1_Recibidas.csv"),
                           stringsAsFactors = FALSE,
                           na.strings = "NA")



# Renombrado de columnas en asig_rec_16172S
asig_rec_16172S = asig_rec_16172S %>% select(token = Contraseña,
                                             asig_objetivos=Muestra.tu.grado.de.acuerdo.o.satisfacción.con.las.afirmaciones.siguientes.en.una.escala.de.1.a.5..donde.1.equivale.a..nada.satisfecho..o..en.total.desacuerdo..y.5.a..totalmente.satisfecho..o..totalmente.de.acuerdo....La.metodología.permite.alcanzar.los.objetivos.de.aprendizaje.de.la.asignatura.,
                                             
                                             asig_aaff_profe=Muestra.tu.grado.de.acuerdo.o.satisfacción.con.las.afirmaciones.siguientes.en.una.escala.de.1.a.5..donde.1.equivale.a..nada.satisfecho..o..en.total.desacuerdo..y.5.a..totalmente.satisfecho..o..totalmente.de.acuerdo....Mi.grado.de.satisfacción.general.respecto.del.profesor.es.,
                                             asig_manual=Muestra.tu.grado.de.acuerdo.o.satisfacción.con.las.afirmaciones.siguientes.en.una.escala.de.1.a.5..donde.1.equivale.a..nada.satisfecho..o..en.total.desacuerdo..y.5.a..totalmente.satisfecho..o..totalmente.de.acuerdo....Las.unidades.didácticas..manual..son.claras.y.están.bien.estructuradas.,
                                             asig_aaff_actividades=Muestra.tu.grado.de.acuerdo.o.satisfacción.con.las.afirmaciones.siguientes.en.una.escala.de.1.a.5..donde.1.equivale.a..nada.satisfecho..o..en.total.desacuerdo..y.5.a..totalmente.satisfecho..o..totalmente.de.acuerdo....Las.actividades.desarrolladas.durante.la.evaluación.continua.han.facilitado.el.aprendizaje.,
                                             asig_aaff_comentarios=X.Si.lo.desea.puede.incluir.cualquier.comentario..observación.o.sugerencia,
                                             henvío=Fecha.de.envío,
                                             Tiempo.total)


# Se crean las variables ausentes en este periodo que aparecerán en estudios posteriores
asig_rec_16172S$'asig_organizacion'=NA
asig_rec_16172S$'pdi_aspectos'=NA
asig_rec_16172S$'pdi_dudas'=NA
  • se fusionan los ficheros de población y muestra para poder trabajar con una única base de datos. Esta operación es necesaria porque, aunque el fichero de respuestas tiene las mismas y todos los atributos que la caracterizan, si se usase solo dicho fichero no sería posible conocer el porcentaje de participación en el estudio y las variables asociadas a la respuesta (como la fecha/hora).
# Añadimos a enviadas los datos de las encuestas recibidas 
asig_result_16172S = list(asig_env_16172S, asig_rec_16172S) %>% reduce(left_join)
  • se realizan las mismas operaciones (con los ajustes necesarios en cuanto a aparición/desaparición de variables) en el resto de periodos.

  • se realiza la fusión de todas las bbdd resultantes de los periodos en un único fichero que se guardará para su posterior uso. Se comenta la generación de bbdd resultante ya que no están cargadas en este script algunas de ellas.

# Se ordenan de más reciente a más antiguo, para que el documento final tenga la estructura del formato de encuesta más reciente y los ítems en desuso más hacia la derecha

# Se comenta la generación de bbdd resultante ya que no están cargadas en este script algunas de ellas

# HistoricoAsignatura = rbind(asig_result_20212S,
#                             asig_result_20211S,
#                             asig_result_19202S,
#                             asig_result_19201S,
#                             asig_result_18192S,
#                             asig_result_18191S,
#                             asig_result_17182S,
#                             asig_result_17181S,
#                             asig_result_16172S,
#                             asig_result_16171S,
#                             asig_result_15162S,
#                             asig_result_15161S,
#                             asig_result_14152S,
#                             asig_result_14151S,
#                             asig_result_13142S,
#                             asig_result_13141S,
#                             asig_result_12132S,
#                             asig_result_12131Smof,
#                             asig_result_12131Sgra)
  • se realizan tareas de limpieza y transformación en el histórico comparado. Se facilitan comentadas dado que es un extracto de un script externo, para evitar errores de ejecución.
# # Arreglo de comentarios vacíos
# HistoricoAsignatura$asig_aaff_comentarios = str_replace_all(HistoricoAsignatura$asig_aaff_comentarios, "[\\s]+", " ")
# HistoricoAsignatura$asig_aaff_comentarios[HistoricoAsignatura$asig_aaff_comentarios %in% c("", " ", "-", 
#                                                                                            "[\\[:punct:]+]", 
#                                                                                            ".", "..", "...", 
#                                                                                            ",", ",,", ",,,")] = NA
  • se aplican técnicas de procesamiento del lenguaje natural NLP para extraer la connotación negativa o positiva de los comentarios expresados por los usuarios. Para ello se ha aplicado el diccionario de léxico NRC mediante la aplicación de las librerías syuzhet y tm. De su aplicación, se obtiene un valor asociado al rango -1:1, donde -1 se corresponde con la máxima connotación negativa y 1 positiva. Para llevarlo a cabo se han aplicado los siguientes pasos:

  • se crean variables donde recoger los tokens de cada comentario,

  • se crea un dataframe vacío, por si al eliminar stopwords el vector está vacío;

  • mediante bucle se recorre el juego de datos, y si tiene comentarios, se eliminan las stopwords del comentario, se obtienen los tokens dividiendo la cadena de caracteres en un listado de palabras o unigramas (tokens), se extraen datos con el Léxico de Sentimientos NRC y se obtiene el valor numérico asociado al comentario.

Se facilitan comentadas dado que es un extracto de un script externo, para evitar errores de ejecución.

# #########################################################
# ########       Diccionario de léxico NRC       ##########
# #########################################################
# 
# # https://programminghistorian.org/es/lecciones/analisis-de-sentimientos-r
# 
# 
# # se crea variable donde recoger los tokens de cada comentario
# HistoricoAsignatura$comentarios_media = NA
# HistoricoAsignatura$comentarios_valor = NA
# HistoricoAsignatura$comentarios_n_terminos = NA
# HistoricoAsignatura$comentarios_valor_normalizado = NA
# 
# # se crea df vacío por si al eliminar stopwords el vector está vacío
# df_vacio = data.frame(anger = NA,
#                       anticipation = NA,
#                       disgust = NA,
#                       fear = NA,
#                       joy = NA,
#                       sadness = NA,
#                       surprise = NA,
#                       trust = NA,
#                       negative = NA,
#                       positive = NA)
# 
# library(syuzhet)
# library(tm)
# 
# # mediante bucle se recorre el histórico de resultados y si tiene comentarios se obtiene una valoración numérica del contenido del mismo
# for (i in 1:nrow(HistoricoAsignatura)) {
#
#   # si tiene comentario, obtener tokens y cuantificar
#   if(!is.na(HistoricoAsignatura$asig_aaff_comentarios[i]) == TRUE){
# 
#     # se eliminan las stopwords del comentario
#     texto_palabras = removeWords(HistoricoAsignatura$asig_aaff_comentarios[i], stopwords("spanish"))
#     
#     # se divide la cadena de caracteres en un listado de palabras o unigramas (tokens)
#     texto_palabras = get_tokens(texto_palabras)
# 
#     # se extraen datos con el Léxico de Sentimientos NRC
#     sentimientos_df = if(length(texto_palabras)>0){
#       get_nrc_sentiment(texto_palabras, lang="spanish")
#     } 
#     
#   } else {
#     sentimientos_df = df_vacio
#   }
#                                            
#     
#     
#     # https://bookdown.org/dparedesi/data-science-con-r/procesamiento-de-cadenas-y-miner%C3%ADa-de-texto.html#miner%C3%ADa-de-texto-mapa-de-palabras
#     
# 
#     # se obtiene valor numérico asociado al comentario
#     HistoricoAsignatura$comentarios_media[i] = (-1*sum(sentimientos_df$negative) + sum(sentimientos_df$positive)) / sum(sentimientos_df$negative, sentimientos_df$positive)
#     HistoricoAsignatura$comentarios_positivos[i] = sum(sentimientos_df$positive)
#     HistoricoAsignatura$comentarios_negativos[i] = sum(sentimientos_df$negative) *-1
#     HistoricoAsignatura$comentarios_valor[i] = sum((sentimientos_df$negative *-1) + sentimientos_df$positive)
#     HistoricoAsignatura$comentarios_n_terminos[i] = sum((sentimientos_df$negative) + sentimientos_df$positive)
#     
#     # se define variable sobre la que dividir, como se busca rango -1/1 
#     denominador = ifelse(!is.null(nrow(sentimientos_df)),
#                          ifelse(nrow(sentimientos_df)>HistoricoAsignatura$comentarios_n_terminos[i],
#                                 nrow(sentimientos_df),
#                                 HistoricoAsignatura$comentarios_n_terminos[i]),
#                          0)
#     
#     HistoricoAsignatura$comentarios_valor_normalizado[i] = ifelse(denominador > 0,
#                                                                   HistoricoAsignatura$comentarios_valor[i]/denominador,
#                                                                   NA)
# 
# } # bucle
  • se procede al guardado del fichero resultante en el directorio de trabajo. Se facilita comentado dado que es un extracto de un script externo, para evitar errores de ejecución.
# ####################################################################################################################
# ##############################                      Guardado del histórico                #########################
# ####################################################################################################################
# 
# # Guardamos el data frame generado en un fichero junto con los excel para por si
# # necesitamos durante el desarrollo cargar HistoricoAsignatura pero no es necesario volver
# # a calcular el data frame. Con un load(paste0(vPathAsignatura, "HistoricoAsignatura.Rda"))
# # bastará para tener el data frame disponible.
# 
# if (file.exists(paste0(vPathAsignatura, "HistoricoAsignatura.Rda"))) {
#   save(HistoricoAsignatura, file = paste0(vPathAsignatura, "HistoricoAsignatura.Rda"))}
# 
# if (!file.exists(paste0(vPathAsignatura, "HistoricoAsignatura.Rda"))) {
#   save(HistoricoAsignatura, file = paste0(vPathAsignatura, "HistoricoAsignatura.Rda"))}
# 
# print("Fin 01_LeerFicherosHistoricoAsignatura.R")

2.2.1.2 Acceso a los datos.

La tarea de acceso se simplifica una vez se han construido estos históricos. Una vez que finalice un estudio (de períodos posteriores al actual), únicamente se debe:

  1. Actualizar el contenido del script .R anterior para cargar los ficheros de población y muestra del nuevo periodo.

  2. Ejecutarlo para que se actualice la bbdd .Rda con los nuevos resultados.

  3. Cargar los datos en el fichero .R o .Rmd en el que se vaya a utilizar mediante la definición de la ruta en la que se encuentra (vPath_) y la carga de la bbdd. Esto se realiza mediante el código:

# ruta donde se encuentra el histórico de resultados
vPath_Asignaturas = "/media/pluto/departamentos/calidad/1_UDIMA/Medición y Análisis/Histórico de resultados/SA-E: Satisfacción semestral de estudiantes/Resultados/"

# se cargan los datos
load(paste0(vPath_Asignaturas, "HistoricoAsignatura.Rda"))

2.2.1.3 Descripción de los datos.

Para cada uno de los juegos de datos se definen:

  • la fuente de datos,

  • los criterios de extracción y las transformaciones necesarias para su obtención,

  • los niveles de agrupación,

  • y las variables que la componen.

2.2.1.3.1 Variables de rendimiento académico y sociodemográficas del estudiantado.

Para la obtención de esta base de datos ha sido necesario utilizar y aplicar:

  • Fuente de datos: programa de gestión académica de la universidad (Universitas XXI o UXXI). Se extraen datos mediante consulta con el software SqlDeveloper a la tabla vaca_rendimientosiiu_udima, y en RStudio se calculan variables a partir de las obtenidas.

  • Criterios de extracción y transformaciones necesarias para su obtención:

  • Se excluyen titulaciones del centro adscrito asociado a la universidad;

  • Se excluyen titulaciones de doble grado;

  • Se excluyen datos de matriculación asociados al presente curso 2022-23 que aún no han generado resultados.

  • Niveles de agrupación: la tabla recoge el rendimiento anual de cada estudiante, por tanto, se deben agrupar los datos realizando sumatorios de los ECTS obtenidos para obtener un único registro con los valores globales de cada estudiante, plan y conjunto de cursos donde ha estado matriculado. En el caso de que el estudiante haya realizado una adaptación de un plan en extinción a un plan nuevo, se realizarán los cálculos oportunos para que el rendimiento generado en la titulación a extinguir sea tenida en cuenta en la titulación adaptada o nueva.

  • Variables que la componen:

Variable Descripción Valores Tipo Explotación
ste_codalf Tipo de estudios 0: Grado, 1: Máster Cardinal
est_codmec Código MEC plan 7 caracteres numéricos Categórica
cen_codnum Código MEC centro 5 caracteres numéricos Categórica
pla_codalf Código plan 3 caracteres numéricos Categórica No, identificativo
exp_numord Número de expediente Numérico Categórica No, identificativo
sexo Sexo 1: Mujer, 0: Hombre Cardinal
edad_inicio Edad inicio estudios >0 Cardinal
id_usuldap Usuario del campus alfanumérico Categórica No, identificativo
nacionalidad 1ª Nacionalidad 1: española, 0: no Cardinal
numdocsinletra Nº documento alfanumérico Categórica No, identificativo
any_anyaca_acceso Curso de vía acceso < 2022-23 Categórica
any_anyaca_inicio Curso inicio estudios < 2022-23 Categórica
titulado Titulación finalizada >=0 Cardinal
tasa_eficiencia 100*ECTS superados/matriculados >=0 Cardinal
t_exito 100*ECTS superados/presentados >=0 Cardinal
t_evaluacion 100*ECTS presentados/matriculados >=0 Cardinal
t_rec 100*ECTS reconocidos/total a superar >=0 Cardinal
t_sup_req 100*ECTS (superados+reconocidos)/total a superar >=0 Cardinal
acceso Tipo acceso presentado 1: Titulado Universitario, 0: No Cardinal
complementos Requiere complementos 1: Sí, 0: No Cardinal
traslado_expediente Traslado de expediente 1: Sí, 0: No Cardinal
n_nodos_fin_titulacion Nº de nodos de finalización (si >1, distintas especialidades) >=0 Cardinal
duracion_media_estudios Número de cursos donde formaliza matrícula. >=0 Cardinal
tasa_abandono 0: si se titula, no se traslada y tiene matrícula activa en dos últimos cursos; 1: en el resto de casos 1: Sí, 0: No Cardinal
nota_media Media ponderada ECTS superados en Udima >=0 Cardinal

Notas: t_rec y t_sup_req pueden superar el 100% ya que están calculadas frentes a los ECTS requeridos para finalizar la titulación, pero pueden superarse más ECTS de los requeridos (optativas, menciones, especialidades).

# ruta donde se encuentra el histórico de resultados
vPath_datos = "/media/pluto/departamentos/calidad/1_UDIMA/Medición y Análisis/Estudio segmentación de estudiantes/datos/"

# se cargan los datos
bbdd_rto = read_delim(paste0(vPath_datos,"vaca_rendimientosiiu_udima.csv"),
                      delim = ";", 
                      escape_double = FALSE, 
                      trim_ws = TRUE)

# nombre de variables a minúscula
names(bbdd_rto) = str_to_lower(names(bbdd_rto))

# se corrigen datos erróneos de curso de inicio de estudios (consultado en CRM)
bbdd_rto$any_anyacaobe[bbdd_rto$any_anyacaobe == "1994-95"] = "2011-12"
bbdd_rto$any_anyacaobe[bbdd_rto$any_anyacaobe == "2003-04"] = "2010-11"

# se define el tipo de datos
bbdd_rto$pla_codalf = as.numeric(bbdd_rto$pla_codalf)
bbdd_rto$exp_numord = as.numeric(bbdd_rto$exp_numord)

# ste codalf a dicotomia 1 Máster, 0 Grado
bbdd_rto$ste_codalf = ifelse(bbdd_rto$ste_codalf == "GRA", 0, 1)
# se cargan los datos
adaptaciones = read_delim(paste0(vPath_datos,"rendimientosiuu_agregado.csv"),
                          delim = ";", 
                          escape_double = FALSE, 
                          trim_ws = TRUE)

# nombre de variables a minúscula
names(adaptaciones) = str_to_lower(names(adaptaciones))




##### Rto en plan de destino #######
# los planes origen de una adaptación deben:
# 1 - obtener su rto para sumarse al plan destino
# 2 - eliminarse de bbdd_rto, porque su rto se sumará al plan destino

# se obtienen adaptaciones
adaptaciones_origen = adaptaciones %>%
  # plan origen no vacío
  filter(!is.na(pla_codalf_adapdes)) %>%
  select(pla_codalf, exp_numord)

adaptaciones_origen$pla_codalf = as.numeric(adaptaciones_origen$pla_codalf)
adaptaciones_origen$exp_numord = as.numeric(adaptaciones_origen$exp_numord)

# 1 - obtener su rto para sumarse al plan destino
adaptaciones_origen_rto = list(adaptaciones_origen, bbdd_rto) %>% reduce(left_join)

# 2 - eliminarse de bbdd_rto, porque su rto se sumará al plan destino
bbdd_rto = bbdd_rto %>% anti_join(adaptaciones_origen)




##### Rto en plan de destino #######
# los planes destino de una adaptación deben:
# 1 - sumar el rto del plan origen
# 2 - sustituir sus valores iniciales en bbdd_rto
# 3 - incorporar los valores calculados a bbdd_rto

# se obtienen adaptaciones
adaptaciones_destino = adaptaciones %>%
  # plan origen no vacío
  filter(!is.na(pla_codalf_adapori)) %>%
  select(pla_codalf, exp_numord, pla_codalf_adapori, exp_numord_adapori, numdocsinletra)

adaptaciones_destino$pla_codalf = as.numeric(adaptaciones_destino$pla_codalf)
adaptaciones_destino$exp_numord = as.numeric(adaptaciones_destino$exp_numord)

# su rto se recupera de bbdd_rto
adaptaciones_destino_rto = list(adaptaciones_destino, bbdd_rto) %>% reduce(left_join)


# 1 - sumar el rto del plan origen
# 1.1 - renombrar columnas para saber qué rendimientos son
# vector a renombrar
v_renombrar = c("creditosmat", "creditoscfmat", "creditos_sup", 
                "creditos_pre", "creditoscf_sup", "creditoscf_pre", 
                "creditosrec", "creditosrecsup", "creditoscfrec", 
                "creditoscfrecsup")

# 1.2 mediante bucle se renombran las variables de origen para saber que lo son
for (i in 1:length(names(adaptaciones_origen_rto))) {
  
  # si la variable está en el vector a renombrar
  if(names(adaptaciones_origen_rto)[i] %in% v_renombrar) {
    # se renombra
    names(adaptaciones_origen_rto)[i] = paste0(names(adaptaciones_origen_rto)[i],
                                               "_origen")
  }
}

# 1.3 mediante bucle se renombran las variables de destino para saber que lo son
for (i in 1:length(names(adaptaciones_destino_rto))) {
  
  # si la variable está en el vector a renombrar
  if(names(adaptaciones_destino_rto)[i] %in% v_renombrar) {
    # se renombra
    names(adaptaciones_destino_rto)[i] = paste0(names(adaptaciones_destino_rto)[i],
                                               "_destino")
  }
}

# 1.4 - se eliminan variables que no son necesarias en origen (para la fusión)
adaptaciones_origen_rto$ste_codalf = NULL
adaptaciones_origen_rto$est_codmec = NULL
adaptaciones_origen_rto$cen_codnum = NULL
adaptaciones_origen_rto$email = NULL
adaptaciones_origen_rto$sexo = NULL
adaptaciones_origen_rto$id_usuldap = NULL
adaptaciones_origen_rto$pai_na1desid = NULL
adaptaciones_origen_rto$pai_na2desid = NULL
adaptaciones_origen_rto$numerodocumento = NULL
adaptaciones_origen_rto$edad_fin = NULL
adaptaciones_origen_rto$any_anyaca_fin = NULL
adaptaciones_origen_rto$titulado = NULL
adaptaciones_origen_rto$credreq = NULL
adaptaciones_origen_rto$edad_actual = NULL
adaptaciones_origen_rto$tasa_eficiencia = NULL

# 1.5 - se eliminan variables que no son necesarias en destino (para la fusión)
adaptaciones_destino_rto$edad_inicio = NULL
adaptaciones_destino_rto$any_anyaca_inicio = NULL
adaptaciones_destino_rto$tasa_eficiencia = NULL

adaptaciones_destino_rto$pla_codalf_dest = adaptaciones_destino_rto$pla_codalf
adaptaciones_destino_rto$pla_codalf = NULL

adaptaciones_destino_rto$exp_numord_dest = adaptaciones_destino_rto$exp_numord
adaptaciones_destino_rto$exp_numord= NULL

adaptaciones_destino_rto$pla_codalf = adaptaciones_destino_rto$pla_codalf_adapori
adaptaciones_destino_rto$exp_numord = adaptaciones_destino_rto$exp_numord_adapori


# 1.6 se fusionan
adaptaciones_rto = list(adaptaciones_destino_rto,
                        adaptaciones_origen_rto) %>% reduce(left_join)


# se renombran variables
adaptaciones_rto$pla_codalf_adapori = NULL
adaptaciones_rto$exp_numord_adapori = NULL
adaptaciones_rto$pla_codalf = NULL
adaptaciones_rto$exp_numord = NULL

adaptaciones_rto$pla_codalf = adaptaciones_rto$pla_codalf_dest
adaptaciones_rto$exp_numord = adaptaciones_rto$exp_numord_dest
adaptaciones_rto$pla_codalf_dest = NULL
adaptaciones_rto$exp_numord_dest = NULL


# 1.7 se suman los ects para tenerlos en plan destino
rto_adaptaciones = adaptaciones_rto %>%
  group_by(# identificativos
            est_codmec = est_codmec,
            pla_codalf = pla_codalf,
            exp_numord = exp_numord,
            id_usuldap,
            numdocsinletra = numdocsinletra,
            # a explotar
            ste_codalf,
            cen_codnum = as.factor(cen_codnum),
            sexo = mujer,
            nacionalidad = ifelse(pai_na1desid == "ESPAÑA", 1, 0), # nacionalidad a dicotómica (1 = Española)
            any_anyaca_acceso,
            any_anyaca_inicio = any_anyacaobe #inicio_estudios
            ) %>%
  summarise(titulado = sum(tituladocursoref),
            # ECTS superados/matriculados
            tasa_eficiencia = ifelse(sum(creditosmat_destino, creditosmat_origen, 
                                         creditoscfmat_destino, creditoscfmat_origen) > 0,
                                     round(100*sum(creditos_sup_destino, creditos_sup_origen, creditoscf_sup_destino,
                                                   creditoscf_sup_origen)/sum(creditosmat_destino, 
                                                                              creditosmat_origen, 
                                                                              creditoscfmat_destino, creditoscfmat_origen), 2),
                                     0),
            # ECTS superados/presentados
            t_exito = ifelse(sum(creditos_sup_destino, creditos_sup_origen, 
                                 creditoscf_sup_destino, creditoscf_sup_origen) > 0,
                             round(100*sum(creditos_sup_destino, creditos_sup_origen, creditoscf_sup_destino, 
                                           creditoscf_sup_origen)/sum(creditos_pre_destino, creditos_pre_origen,
                                                                      creditoscf_pre_destino, creditoscf_pre_origen), 2),
                             0),
            # ECTS presentados/matriculados
            t_evaluacion = ifelse(sum(creditosmat_destino, creditosmat_origen, creditoscfmat_destino, 
                                      creditoscfmat_origen) > 0,
                                  round(100*sum(creditos_pre_destino, creditos_pre_origen, creditoscf_pre_destino,
                                                creditoscf_pre_origen)/sum(creditosmat_destino, creditosmat_origen,
                                                                           creditoscfmat_destino, creditoscfmat_origen), 2),
                                  0),
            # ECTS reconocidos/total a superar 
            t_rec = ifelse(sum(creditosrec_destino, creditosrec_origen) > 0,
                           round(100*sum(creditosrec_destino, creditosrec_origen)/max(credreq), 2),
                           0),
            # ECTS (superados+reconocidos)/total a superar 
            t_sup_req = ifelse(sum(creditosrec_destino, creditosrec_origen, creditos_sup_destino,
                                   creditos_sup_origen, creditoscf_sup_destino, creditoscf_sup_origen) > 0,
                               round(100*sum(creditosrec_destino, creditosrec_origen, creditos_sup_destino, 
                                             creditos_sup_origen, creditoscf_sup_destino, 
                                             creditoscf_sup_origen)/max(credreq), 2),
                               0),
            edad_inicio = edad - (22 - as.numeric(substr(any_anyaca_inicio, start = 2, stop = 4))))

# # 2 - sustituir sus valores iniciales en rto_total
# rto_total = rto_total %>% anti_join(adaptaciones_destino)
# 
# # 3 - incorporar los valores calculados a rto_total
# # names(rto_total)[!names(rto_total) %in% names(rto_adaptaciones)]
# rto_total = rbind(rto_total,
#                   rto_adaptaciones)
# calculos rto y aplicación de adaptaciones realizadas

# se obtienen los datos
rto_total = bbdd_rto %>%
  filter(est_codmec >4, # se descartan las matrículas de erasmus
         cen_codnum != 11421, # se descarta el centro adscrito
         any_anyacaobe < "2022-23", # se descarta curso actual de matrícula
         any_anyaca < "2022-23", # se descarta curso actual de finalización
         !(between(pla_codalf, as.numeric("180"), as.numeric("500"))) # no dobles grados
         ) %>%
  group_by(# identificativos
            est_codmec = est_codmec,
            pla_codalf = pla_codalf,
            exp_numord = exp_numord,
            id_usuldap,
            numdocsinletra = numdocsinletra,
            # a explotar
            ste_codalf,
            cen_codnum = as.factor(cen_codnum),
            sexo = mujer,
            nacionalidad = ifelse(pai_na1desid == "ESPAÑA", 1, 0),
            any_anyaca_acceso,
            any_anyaca_inicio = any_anyacaobe #inicio_estudios
            ) %>%
  summarise(titulado = sum(tituladocursoref),
            # ECTS superados/matriculados
            tasa_eficiencia = ifelse(sum(creditosmat, creditoscfmat) > 0,
                                     round(100*sum(creditos_sup, creditoscf_sup)/sum(creditosmat, creditoscfmat), 2),
                                     NA),
            # ECTS superados/presentados
            t_exito = ifelse(sum(creditos_sup, creditoscf_sup) > 0,
                             round(100*sum(creditos_sup, creditoscf_sup)/sum(creditos_pre, creditoscf_pre), 2),
                             NA),
            # ECTS presentados/matriculados
            t_evaluacion = ifelse(sum(creditosmat, creditoscfmat) > 0,
                                  round(100*sum(creditos_pre, creditoscf_pre)/sum(creditosmat, creditoscfmat), 2),
                                  NA),
            # ECTS reconocidos/total a superar 
            t_rec = ifelse(sum(creditosrec) > 0,
                           round(100*sum(creditosrec)/max(credreq), 2),
                           NA),
            # ECTS (superados+reconocidos)/total a superar 
            t_sup_req = ifelse(sum(creditosrec, creditos_sup, creditoscf_sup) > 0,
                               round(100*sum(creditosrec, creditos_sup, creditoscf_sup)/max(credreq), 2),
                               NA),
            edad_inicio = edad - (22 - as.numeric(substr(any_anyaca_inicio, start = 2, stop = 4))))



# valores únicos
rto_total = unique(rto_total)


# se continuan los pasos de las adaptaciones destino del chun anterior
# 2 - sustituir sus valores iniciales en rto_total
rto_total = rto_total %>% anti_join(adaptaciones_destino)

# 3 - incorporar los valores calculados a rto_total
# names(rto_total)[!names(rto_total) %in% names(rto_adaptaciones)]
rto_total = rbind(rto_total,
                  rto_adaptaciones)
# ruta donde se encuentra el histórico de resultados
vPath_accesos = "/media/pluto/departamentos/calidad/1_UDIMA/Medición y Análisis/Estudio segmentación de estudiantes/datos/accesos/"

# se cargan los datos
accesos = read_excel(paste0(vPath_accesos, "accesos.xlsx"), 
                     sheet = "Exportar Hoja de Trabajo")

# nombre de variables a minúscula
names(accesos) = str_to_lower(names(accesos))

# valores unicos
accesos = unique(accesos)

# se transforman datos para poder fusionar
accesos$pla_codalf = as.numeric(accesos$pla_codalf)

# se convierte a dicotómica
accesos$acceso = ifelse(accesos$acceso == 'Titulado Universitario', 1, 0)
accesos$complementos = ifelse(accesos$complementos == "Sí", 1, 0)

accesos$subacceso = NULL

# hay accesos duplicados, uno con complementos y otro sin, se simplifica
accesos_dobles = accesos %>%
  group_by(pla_codalf, exp_numord, acceso) %>%
  count() %>%
  filter(n == 2)

accesos_dobles$n = NULL
accesos_dobles$complementos = 1

# se eliminan de accesos
accesos = accesos %>% anti_join(accesos_dobles)

# se añaden simplificados
accesos = rbind(accesos,
                accesos_dobles)



# se incluyen los datos de acceso a los de rto_total
rto_total = list(rto_total, accesos) %>% reduce(left_join)
# se cargan los datos
abandono = read_delim(paste0(vPath_datos,"tasa_abandono.csv"),
                      delim = ";", 
                      escape_double = FALSE, 
                      trim_ws = TRUE)

# nombre de variables a minúscula
names(abandono) = str_to_lower(names(abandono))

# se obtienen datos a fusionar
tasa_abandono = abandono %>%
  group_by(pla_codalf = as.numeric(pla_codalf),
           exp_numord,
           tasa_abandono = abandono,
           traslado_expediente = ifelse(is.na(ttr_codalf), 0, 1), # dicotómica
           n_nodos_fin_titulacion = sum_nodos_total) %>%
  summarise(duracion_media_estudios = max(num_anios_matriculado_total))

# se incluyen los datos de abandono a los de rto_total
rto_total = list(rto_total, tasa_abandono) %>% reduce(left_join)
# se cargan los datos
notas = read_excel(paste0(vPath_datos,"nota_media_expediente.xlsx"))

# nombre de variables a minúscula
names(notas) = str_to_lower(names(notas))

# se obtienen datos a fusionar
nota_egreso = notas %>%
  group_by(pla_codalf = as.numeric(pla_codalf),
           exp_numord) %>%
  select(nota_media = mediaudima)


# se incluyen los datos de acceso a los de rto_total
rto_total = list(rto_total, nota_egreso) %>% reduce(left_join)
2.2.1.3.2 Satisfacción manifestada (o no) por los estudiantes sobre las asignaturas matriculadas.

Para la obtención de esta base de datos ha sido necesario utilizar y aplicar:

  • Fuente de datos: histórico de resultados de satisfacción del estudiantado con las asignaturas construido mediante RStudio para la gestión y almacenado de datos no disponibles en bases datos (satisfacción). Ver apartado Recopilación de datos.

  • Criterios de extracción y transformaciones necesarias para su obtención:

  • Se excluyen titulaciones del centro adscrito asociado a la universidad;

  • Se excluyen titulaciones de doble grado.

  • Niveles de agrupación: la base de datos recoge la satisfacción semestral de cada estudiante en cada plan, asignatura y docente en el que está matriculado, por tanto, se agrupan los datos realizando promedios de la obtención manifestada para obtener un único registro por estudiante. En el caso de que el estudiante haya realizado una adaptación de un plan en extinción a un plan nuevo, se realizarán los cálculos oportunos para que la satisfacción manifestada en la titulación a extinguir sea tenida en cuenta en la titulación adaptada o nueva.

  • Variables que la componen:

Variable Descripción Valores Tipo Explotación
pla_codalf Código plan 3 caracteres numéricos Categórica No, identificativo
exp_numord Número de expediente Numérico Categórica No, identificativo
sa_asig_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_asig_participacion Proporción de encuestas respondidas por el estudiante en las asignaturas del plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_asig_organizacion Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem La organización de la asignatura facilita el aprendizaje de esta asignatura. Escala 1-5 >=1 y <= 5 Cardinal
sa_asig_manual Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem El manual facilita el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_materiales Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem Otros materiales didácticos aportados facilitan el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_actividades Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem Las actividades didácticas planteadas facilitan el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_docente Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem La labor del docente facilita el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_aprendiendo Porcentaje de respuestas al ítem ¿Consideras que estás aprendiendo? respecto de las encuestas respondidas por el estudiante en las asignaturas entre 0 y 1 Cardinal
sa_asig_comentarios Promedio de la connotación del contenido de los comentarios realizados por el estudiante en las encuestas de las asignaturas entre -1 y 1 Cardinal

Representatividad de la muestra (determina si la muestra es estadísticamente significativa): Dado que las respuestas recibidas responden a un muestreo se determina la obtención de muestra representativa mediante la fórmula:

\[Muestra\ representativa\ (n)\ = \frac{\frac{z^{2}\ p\ (1-p)\ }{e^{2}}}{1 + \frac{z^{2}\ p\ (1-p)\ }{e^{2} N\ }}\]

Siendo:

  • Nivel de confianza (NC) del 80%, lo que implica Z-score (z) de 1.282.

  • Proporción esperada (p): para maximizar el tamaño muestral será de 0.5 (50%).

  • Error muestral (e) del 10%.

  • Población (N): cantidad total de usuarios a los que se invita a participar en el estudio.

# ruta donde se encuentra el histórico de resultados
vPath_Asignaturas = "/media/pluto/departamentos/calidad/1_UDIMA/Medición y Análisis/Histórico de resultados/SA-E: Satisfacción semestral de estudiantes/Resultados/"

# se cargan los datos
load(paste0(vPath_Asignaturas, "HistoricoAsignatura.Rda"))
# se duplica el histórico para incluir los planes adaptados
HistoricoAsignatura_adaptado = HistoricoAsignatura

# se transforman las opiniones de planes adaptados
adaptaciones_origen_destino = adaptaciones_destino %>%
  select(plan = pla_codalf_adapori,
         documento = numdocsinletra,
         expediente = exp_numord_adapori,
         pla_codalf_destino = pla_codalf,
         exp_numord_destino = exp_numord
         )

# se convierten a numérico para evitar que traiga el valor del orden del factor
adaptaciones_origen_destino$plan = as.numeric(adaptaciones_origen_destino$plan)
adaptaciones_origen_destino$expediente = as.numeric(adaptaciones_origen_destino$expediente)
adaptaciones_origen_destino$pla_codalf_destino = as.character(adaptaciones_origen_destino$pla_codalf_destino)
adaptaciones_origen_destino$exp_numord_destino = as.character(adaptaciones_origen_destino$exp_numord_destino)

# se unen
HistoricoAsignatura_adaptado = list(HistoricoAsignatura_adaptado, adaptaciones_origen_destino) %>% reduce(left_join)



# se realizan los cambios de plan y expediente de las adaptaciones
for (i in 1:nrow(HistoricoAsignatura_adaptado)) {
  
  # si el plan se ha adaptado, se modifica
  HistoricoAsignatura_adaptado$plan[i] = if(is.na(HistoricoAsignatura_adaptado$pla_codalf_destino[i])){
    HistoricoAsignatura_adaptado$plan[i]
  } else {
    HistoricoAsignatura_adaptado$pla_codalf_destino[i]
  }
  
  # igual con expedientes
  HistoricoAsignatura_adaptado$expediente[i] = if(is.na(HistoricoAsignatura_adaptado$exp_numord_destino[i])){
    HistoricoAsignatura_adaptado$expediente[i]
  } else {
    HistoricoAsignatura_adaptado$exp_numord_destino[i]
  }

} # fin bucle


# se obtienen los datos
satisfaccion_estudiante_asignatura = HistoricoAsignatura_adaptado %>%
  group_by(pla_codalf = as.numeric(plan),
           exp_numord = as.numeric(expediente)
           ) %>%
  summarise(sa_asig_N = n(),
            sa_asig_n = sum(usesleft!='1'),
            sa_asig_R = if(sa_asig_n>=(1.282**2*0.5**2/(0.1**2))/(1+(1.282**2*0.5**2/(0.1**2*sa_asig_N)))) {1} else {0},
            sa_asig_participacion = round(100*sa_asig_n/sa_asig_N, 2),
            sa_asig_organizacion = round(mean(asig_organizacion, na.rm = TRUE), 2),
            sa_asig_manual = round(mean(asig_manual, na.rm = TRUE), 2),
            sa_asig_materiales = round(mean(asig_materiales, na.rm = TRUE), 2),
            sa_asig_actividades = round(mean(asig_aaff_actividades, na.rm = TRUE), 2),
            sa_asig_docente = round(mean(asig_aaff_profe, na.rm = TRUE), 2),
            sa_asig_aprendiendo = if(sum(`asig_aprendiendo`=="Sí", na.rm = TRUE)>0 && any_anyaca >= "2017-18") {
              round(100*(sum(`asig_aprendiendo`=="Sí", na.rm = TRUE))
                    /sum(usesleft!='1'), 2)
              } else {
                NA
                },
            sa_asig_comentarios = round(mean(comentarios_valor_normalizado, na.rm = TRUE), 2)) %>%
  arrange(pla_codalf, as.numeric(exp_numord))

# se corrigen valores
satisfaccion_estudiante_asignatura$sa_asig_aprendiendo = ifelse(satisfaccion_estudiante_asignatura$sa_asig_aprendiendo > 100,
                                                                100,
                                                                satisfaccion_estudiante_asignatura$sa_asig_aprendiendo)

# se eliminan los registros sin expediente
satisfaccion_estudiante_asignatura_exp = satisfaccion_estudiante_asignatura %>%
  filter(!is.na(exp_numord))

# se incluyen los datos de satisfaccion_estudiante_asignatura a los de rto_total
rto_total = list(rto_total, satisfaccion_estudiante_asignatura_exp) %>% reduce(left_join)

# se eliminan las variables de muestra
rto_total$sa_asig_N = NULL
rto_total$sa_asig_n = NULL
2.2.1.3.3 Satisfacción manifestada (o no) por los estudiantes sobre el desarrollo del curso.

Para la obtención de esta base de datos ha sido necesario utilizar y aplicar:

  • Fuente de datos: histórico de resultados de satisfacción del estudiantado con el curso construido mediante RStudio para la gestión y almacenado de datos no disponibles en bases datos (satisfacción). Ver apartado Recopilación de datos.

  • Criterios de extracción y transformaciones necesarias para su obtención:

  • Se excluyen titulaciones del centro adscrito asociado a la universidad;

  • Se excluyen titulaciones de doble grado.

  • Niveles de agrupación: la base de datos recoge la satisfacción anual de cada estudiante para cada plan y curso en que está matriculado (este estudio se inicia en 2017-18), por tanto, se agrupan los datos realizando promedios de la obtención manifestada para obtener un único registro por estudiante. En el caso de que el estudiante haya realizado una adaptación de un plan en extinción a un plan nuevo, se realizarán los cálculos oportunos para que la satisfacción manifestada en la titulación a extinguir sea tenida en cuenta en la titulación adaptada o nueva.

  • Variables que la componen:

Variable Descripción Valores Tipo Explotación
pla_codalf Código plan 3 caracteres numéricos Categórica No, identificativo
exp_numord Número de expediente Numérico Categórica No, identificativo
sa_curso_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_curso_participacion Proporción de encuestas respondidas por el estudiante en los cursos matriculados en el plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_curso_nivel_academico Promedio de valoraciones aportadas por el estudiante en los cursos matriculados en el plan para el ítem ‘Mi nivel académico y de conocimientos a la hora de afrontar los estudios’. Escala 1-5 >=1 y <= 5 Cardinal
sa_curso_implicacion Promedio de valoraciones aportadas por el estudiante en los cursos matriculados en el plan para el ítem ‘Mi implicación con los estudios’. Escala 1-5 >=1 y <= 5 Cardinal
sa_curso_aprovechamiento_recursos Promedio de valoraciones aportadas por el estudiante en los cursos matriculados en el plan para el ítem ‘Mi aprovechamiento de los recursos didácticos disponibles’. Escala 1-5 >=1 y <= 5 Cardinal
sa_curso_titulacion Promedio de valoraciones aportadas por el estudiante en los cursos matriculados en el plan para el ítem ‘Grado de satisfacción general con la titulación’. Escala 1-5 >=1 y <= 5 Cardinal
sa_curso_recomendacion Proporción de respuestas al ítem ¿Recomendarías estudiar en la Udima a otra persona? respecto de las encuestas respondidas por el estudiante en los cursos matriculados en el plan entre 0 y 1 Cardinal
sa_curso_comentarios Promedio de la connotación del contenido de los comentarios realizados por el estudiante en las encuestas de curso entre -1 y 1 Cardinal

Representatividad de la muestra (determina si la muestra es estadísticamente significativa): Dado que las respuestas recibidas responden a un muestreo se determina la obtención de muestra representativa mediante la fórmula:

\[Muestra\ representativa\ (n)\ = \frac{\frac{z^{2}\ p\ (1-p)\ }{e^{2}}}{1 + \frac{z^{2}\ p\ (1-p)\ }{e^{2} N\ }}\]

Siendo:

  • Nivel de confianza (NC) del 80%, lo que implica Z-score (z) de 1.282.

  • Proporción esperada (p): para maximizar el tamaño muestral será de 0.5 (50%).

  • Error muestral (e) del 10%.

  • Población (N): cantidad total de usuarios a los que se invita a participar en el estudio.

# ruta donde se encuentra el histórico de resultados
vPath_curso = "/media/pluto/departamentos/calidad/1_UDIMA/Medición y Análisis/Histórico de resultados/SA-E-CA: Satisfacción anual de estudiantes con el curso/Resultados/"

# se cargan los datos
load(paste0(vPath_curso, "Historico_SA_E_CA.Rda"))

# se duplica el histórico para incluir los planes adaptados
Historico_SA_E_CA_adaptado = Historico_SA_E_CA

# se unen
Historico_SA_E_CA_adaptado = list(Historico_SA_E_CA_adaptado, adaptaciones_origen_destino) %>% reduce(left_join)


# se realizan los cambios de plan y expediente de las adaptaciones
for (i in 1:nrow(Historico_SA_E_CA_adaptado)) {
  
  # si el plan se ha adaptado, se modifica
  Historico_SA_E_CA_adaptado$plan[i] = if(is.na(Historico_SA_E_CA_adaptado$pla_codalf_destino[i])){
    Historico_SA_E_CA_adaptado$plan[i]
  } else {
    Historico_SA_E_CA_adaptado$pla_codalf_destino[i]
  }
  
  # igual con expedientes
  Historico_SA_E_CA_adaptado$expediente[i] = if(is.na(Historico_SA_E_CA_adaptado$exp_numord_destino[i])){
    Historico_SA_E_CA_adaptado$expediente[i]
  } else {
    Historico_SA_E_CA_adaptado$exp_numord_destino[i]
  }

} # fin bucle

# se obtienen los datos
satisfaccion_estudiante_curso = Historico_SA_E_CA_adaptado %>% # no títulos propios
  group_by(pla_codalf = as.numeric(plan),
           exp_numord = as.numeric(expediente)
           ) %>%
  summarise(sa_curso_N = n(),
            sa_curso_n = sum(usesleft!='1'),
            sa_curso_R = if(sa_curso_n>=(1.282**2*0.5**2/(0.1**2))/(1+(1.282**2*0.5**2/(0.1**2*sa_curso_N)))) {1} else {0},
            sa_curso_participacion = round(100*sa_curso_n/sa_curso_N, 2),
            sa_curso_nivel_academico = round(mean(cur_desemp_nivelacad, na.rm = TRUE), 2),
            sa_curso_implicacion = round(mean(cur_desemp_implic, na.rm = TRUE), 2),
            sa_curso_aprovechamiento_recursos = round(mean(cur_desemp_aprov, na.rm = TRUE), 2),
            sa_curso_titulacion = round(mean(cur_sa_satit, na.rm = TRUE), 2),
            sa_curso_recomendacion = if(sum(`cur_recom`=="Sí", na.rm = TRUE)>0) {
              round(100*(sum(`cur_recom`=="Sí", na.rm = TRUE)
                               /sum(usesleft!='1')), 
                          2)} else {
                      NA
                    },
            sa_curso_comentarios = round(mean(comentarios_valor_normalizado, na.rm = TRUE), 2)) %>%
  arrange(pla_codalf, as.numeric(exp_numord))



# se incluyen los datos de satisfaccion_estudiante_curso a los de rto_total
rto_total = list(rto_total, satisfaccion_estudiante_curso) %>% reduce(left_join)

# se eliminan las variables de muestra
rto_total$sa_curso_N = NULL
rto_total$sa_curso_n = NULL
2.2.1.3.4 Satisfacción manifestada (o no) por los egresados sobre la titulación.

Para la obtención de esta base de datos ha sido necesario utilizar y aplicar:

  • Fuente de datos: histórico de resultados de satisfacción de egresados con la titulación construido mediante RStudio para la gestión y almacenado de datos no disponibles en bases datos (satisfacción). Ver apartado Recopilación de datos.

  • Criterios de extracción y transformaciones necesarias para su obtención:

  • Se excluyen titulaciones del centro adscrito asociado a la universidad;

  • Niveles de agrupación: la base de datos recoge la satisfacción de cada egresado con la titulación en cada plan. En la mayoría de casos, la encuesta será única excepto que egrese varias veces en la titulación tras realizar varias especialidades/menciones (esto sucede si n_nodos_fin_titulacion > 1). Por tanto, se agrupan los datos realizando promedios de la obtención manifestada para obtener un único registro por egresado. No es necesario realizar cálculos en el caso de que se haya adaptado a un plan nuevo porque la encuesta se realiza sobre el plan en el que se egresa.

  • Variables que la componen:

Variable Descripción Valores Tipo Explotación
pla_codalf Código plan 3 caracteres numéricos Categórica No, identificativo
exp_numord Número de expediente Numérico Categórica No, identificativo
sa_titulacion_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_titulacion_participacion Proporción de encuestas respondidas por el egresado en los cursos de egreso en el plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_titulacion_nivel_academico Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘Mi nivel académico y de conocimientos a la hora de afrontar los estudios’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_implicacion Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘Mi implicación con los estudios’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_aprovechamiento_recursos Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘Mi aprovechamiento de los recursos didácticos disponibles’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_mejora_profesional Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘La titulación obtenida ha supuesto una mejora profesional’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_obtener_trabajo Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘La titulación obtenida ha supuesto obtener un puesto de trabajo’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_titulacion Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘Grado de satisfacción general con la titulación’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_recomendacion Proporción de respuestas al ítem ¿Recomendarías estudiar en la Udima a otra persona? respecto de las encuestas respondidas por el estudiante en los cursos egresados en el plan entre 0 y 1 Cardinal
sa_titulacion_comentarios Promedio de la connotación del contenido de los comentarios realizados por el estudiante egresado en las encuestas del título entre -1 y 1 Cardinal

Representatividad de la muestra (determina si la muestra es estadísticamente significativa): Dado que las respuestas recibidas responden a un muestreo se determina la obtención de muestra representativa mediante la fórmula:

\[Muestra\ representativa\ (n)\ = \frac{\frac{z^{2}\ p\ (1-p)\ }{e^{2}}}{1 + \frac{z^{2}\ p\ (1-p)\ }{e^{2} N\ }}\]

Siendo:

  • Nivel de confianza (NC) del 80%, lo que implica Z-score (z) de 1.282.

  • Proporción esperada (p): para maximizar el tamaño muestral será de 0.5 (50%).

  • Error muestral (e) del 10%.

  • Población (N): cantidad total de usuarios a los que se invita a participar en el estudio.

# ruta donde se encuentra el histórico de resultados
vPath_egresados= "/media/pluto/departamentos/calidad/1_UDIMA/Medición y Análisis/Histórico de resultados/SA-EGRE: Satisfacción anual de egresados con el título/Resultados/"

# se cargan los datos
load(paste0(vPath_egresados, "Historico_SA_EGRE.Rda"))

# se duplica el histórico para incluir los planes adaptados
Historico_SA_EGRE_adaptado = Historico_SA_EGRE

# se unen
Historico_SA_EGRE_adaptado = list(Historico_SA_EGRE_adaptado, adaptaciones_origen_destino) %>% reduce(left_join)


# se obtienen los datos
satisfaccion_egresados_titulacion = Historico_SA_EGRE_adaptado %>%
  group_by(pla_codalf = as.numeric(plan),
           exp_numord = as.numeric(expediente)
           ) %>%
  summarise(sa_titulacion_N = n(),
            sa_titulacion_n = sum(usesleft!='1'),
            sa_titulacion_R = if(sa_titulacion_n>=(1.282**2*0.5**2/(0.1**2))/(1+(1.282**2*0.5**2/(0.1**2*sa_titulacion_N)))) {1} else {0},
            sa_titulacion_participacion = round(100*sa_titulacion_n/sa_titulacion_N, 2),
            sa_titulacion_nivel_academico = round(mean(des_nivel, na.rm = TRUE), 2),
            sa_titulacion_implicacion = round(mean(des_implic, na.rm = TRUE), 2),
            sa_titulacion_aprovechamiento_recursos = round(mean(des_recurso, na.rm = TRUE), 2),
            sa_titulacion_mejora_profesional = round(mean(il_mejoraprof, na.rm = TRUE), 2),
            sa_titulacion_obtener_trabajo = round(mean(il_obtenctrab, na.rm = TRUE), 2),
            sa_titulacion_titulacion = round(mean(sa_tit, na.rm = TRUE), 2),
            sa_titulacion_recomendacion = if(sum(`sa_recom`=="Sí", na.rm = TRUE)>0) {
              round(100*(sum(`sa_recom`=="Sí", na.rm = TRUE)
                         /sum(usesleft!='1')), 
                    2)} else {
                      NA
                    },
            sa_titulacion_comentarios = round(mean(comentarios_valor_normalizado, na.rm = TRUE), 2)) %>%
  arrange(pla_codalf, as.numeric(exp_numord))
  
# se incluyen los datos de satisfaccion_egresados_titulacion a los de rto_total
rto_total = list(rto_total, satisfaccion_egresados_titulacion) %>% reduce(left_join)


# se eliminan las variables de muestra
rto_total$sa_titulacion_N = NULL
rto_total$sa_titulacion_n = NULL
2.2.1.3.5 Inserción laboral manifestada (o no) por los egresados.

Para la obtención de esta base de datos ha sido necesario utilizar y aplicar:

  • Fuente de datos: histórico de resultados de inserción laboral de egresados con la titulación construido mediante RStudio para la gestión y almacenado de datos no disponibles en bases datos (inserción laboral). Ver apartado Recopilación de datos.

  • Criterios de extracción y transformaciones necesarias para su obtención:

  • Se excluyen titulaciones del centro adscrito asociado a la universidad;

  • Niveles de agrupación: la base de datos recoge la inserción laboral de cada egresado con la titulación. Este estudio se realiza en dos ocasiones por cada plan-egresado (una al curso de egresar: Tipo I y otra a los dos cursos: Tipo II). En la mayoría de casos, la encuesta será única excepto que egrese varias veces en la titulación tras realizar varias especialidades/menciones (esto sucede si n_nodos_fin_titulacion > 1). Por tanto, se agrupan los datos realizando promedios de la obtención manifestada para obtener un único registro por egresado. No es necesario realizar cálculos en el caso de que se haya adaptado a un plan nuevo porque el estudio se realiza sobre el plan en el que se egresa.

  • Variables que la componen:

Variable Descripción Valores Tipo Explotación
pla_codalf Código plan 3 caracteres numéricos Categórica No, identificativo
exp_numord Número de expediente Numérico Categórica No, identificativo
il_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
il_participacion Proporción de encuestas respondidas por el egresado en los cursos de egreso y estudios en el plan respecto de las que han sido enviadas (estudios tipo I y II, realizados respectivamente, al año y dos años de egresar) entre 0 y 1 Cardinal
il_motivo_estudios Valoración aportada por el egresado en los estudios tipo I y II en el plan para el ítem ¿Por qué realizaste tus estudios en UDIMA? 1: Mejora laboral; 0: Otros Cardinal
il_consecuencia_estudios Valoración aportada por el egresado en los estudios tipo I y II en el plan para el ítem ¿Qué ha supuesto la realización de los estudios? 1: Conseguir o mejorar un empleo; 0: No variación u Otro Cardinal
il_trabajo_actual Valoración aportada por el egresado en los estudios tipo I y II en el plan para el ítem ¿Trabajas actualmente? 1, Sí; 0, No Cardinal
il_trabajo_actual_relacionado_estudios Valoración aportada por el egresado en los estudios tipo I y II en el plan para el ítem ¿Trabajas actualmente en alguna actividad relacionada con los estudios finalizados? 1, Sí; 0, No Cardinal
il_comentarios Promedio de la connotación del contenido de los comentarios realizados por el estudiante egresado en el estudio de inserción laboral del título entre -1 y 1 Cardinal

Representatividad de la muestra (determina si la muestra es estadísticamente significativa): Dado que las respuestas recibidas responden a un muestreo se determina la obtención de muestra representativa mediante la fórmula:

\[Muestra\ representativa\ (n)\ = \frac{\frac{z^{2}\ p\ (1-p)\ }{e^{2}}}{1 + \frac{z^{2}\ p\ (1-p)\ }{e^{2} N\ }}\]

Siendo:

  • Nivel de confianza (NC) del 80%, lo que implica Z-score (z) de 1.282.

  • Proporción esperada (p): para maximizar el tamaño muestral será de 0.5 (50%).

  • Error muestral (e) del 10%.

  • Población (N): cantidad total de usuarios a los que se invita a participar en el estudio.

# ruta donde se encuentra el histórico de resultados
vPath_insercion= "/media/pluto/departamentos/calidad/1_UDIMA/Medición y Análisis/Histórico de resultados/IL-EGRE: Inserción Laboral de Egresados/Resultados/"

# se cargan los datos
load(paste0(vPath_insercion, "HistoricoInsercionLaboral.Rda"))

# No son necesarias adaptaciones porque solo egresan en el plan destino

# Se convierten a dicotómicas

# variable il_motivo_estudios: 1 Mejora laboral
# se define vector con tipos de respuestas que serán 1
mejora = c("Para mejorar mi situación laboral.",
          "Interés personal, Promoción interna",
          "Para conseguir un puesto de trabajo.",
          "Interés personal, Mejora empleabilidad",
          "Cubrir requisitos",
          "Mejora empleabilidad, Cubrir requisitos",
          "Ofrecimiento empresa",
          "Interés personal, Cubrir requisitos",
          "Interés personal, Promoción interna, Mejora empleabilidad")

# si la opción contenida en vector 1, si no 0 y si está vacía NA
HistoricoInsercionLaboral$pe_estudios_razon = ifelse(HistoricoInsercionLaboral$pe_estudios_razon %in% mejora,
                                                     1,
                                                     ifelse(!is.na(HistoricoInsercionLaboral$pe_estudios_razon),
                                                            0, NA))


# variable il_consecuencia_estudios
consecuencia = c("Conseguir un empleo.", 
                 "Mejorar mi posición profesional.")

HistoricoInsercionLaboral$pe_estudios_consecuencia = ifelse(HistoricoInsercionLaboral$pe_estudios_consecuencia %in% consecuencia,
                                                     1,
                                                     ifelse(!is.na(HistoricoInsercionLaboral$pe_estudios_consecuencia),
                                                            0, NA))

# variable il_trabajo_actual y trabaja_estudios (1 sí)
HistoricoInsercionLaboral$pe_trabaja = ifelse(HistoricoInsercionLaboral$pe_trabaja == 'Sí', 1, 
                                              ifelse(!is.na(HistoricoInsercionLaboral$pe_trabaja),
                                                            0, NA))

HistoricoInsercionLaboral$trabaja_estudios = ifelse(HistoricoInsercionLaboral$trabaja_estudios == 'Sí', 1, 
                                              ifelse(!is.na(HistoricoInsercionLaboral$trabaja_estudios),
                                                            0, NA))


# se obtienen los datos
insercion_laboral = HistoricoInsercionLaboral %>%
  group_by(pla_codalf = as.numeric(plan),
           exp_numord = as.numeric(expediente),
           completed
           ) %>%
  summarise(il_N = n(),
            il_n = sum(usesleft!='1'),
            il_R = if(il_n>=(1.282**2*0.5**2/(0.1**2))/(1+(1.282**2*0.5**2/(0.1**2*il_N)))) {1} else {0},
            il_participacion = round(100*il_n/il_N, 2),
            il_motivo_estudios = pe_estudios_razon,
            il_consecuencia_estudios = pe_estudios_consecuencia,
            il_trabajo_actual = pe_trabaja,
            il_trabajo_actual_relacionado_estudios = trabaja_estudios,
            il_comentarios = round(mean(comentarios_valor_normalizado, na.rm = TRUE), 2)) %>%
  arrange(pla_codalf, as.numeric(exp_numord))
  
  
# Para duplicados, último registro más actual
insercion_laboral = insercion_laboral %>%
  group_by(pla_codalf,
           exp_numord) %>%
  filter(completed==max(completed)) %>%
  arrange(pla_codalf, exp_numord)

# valores únicos
insercion_laboral = unique(insercion_laboral)
insercion_laboral$completed = NULL


# se incluyen los datos de insercion_laboral a los de rto_total
rto_total = list(rto_total, insercion_laboral) %>% reduce(left_join)


# se eliminan las variables de muestra
rto_total$il_N = NULL
rto_total$il_n = NULL
2.2.1.3.6 Características de comportamiento en LMS que definen al estudiantado.

Para la obtención de esta base de datos ha sido necesario utilizar y aplicar:

  • Fuente de datos: LMS (Learning Management System): Moodle. Se extraen datos mediante consulta con el software dbeaver-ce.

  • Criterios de extracción y transformaciones necesarias para su obtención:

  • Se excluyen titulaciones del centro adscrito asociado a la universidad;

  • Niveles de agrupación: la base de datos recoge el total de conexiones realizadas por el usuario en las distintas franjas horarias, por curso y mes. Los valores se agrupan para determinar el comportamiento del usuario en la plataforma y se construye una variable por cada franja diaria y horario, con el fin de obtener el % de conexión en las distintas franjas por usuario.

  • Variables que la componen:

Variable Descripción Valores Tipo Explotación
id_usuldap Usuario del campus alfanumérico Categórica No, identificativo
dias_laborable Proporción de conexiones del usuario a la plataforma LMS moodle en días de diario (lunes a viernes) entre 0 y 100 Cardinal
dias_festivo Proporción de conexiones del usuario a la plataforma LMS moodle en días festivos (sábado y domingo) entre 0 y 100 Cardinal
horario_mañana Proporción de conexiones del usuario a la plataforma LMS moodle en horario de mañana (entre las 7:00 y las 12:59) entre 0 y 100 Cardinal
horario_tarde Proporción de conexiones del usuario a la plataforma LMS moodle en horario de tarde (entre las 13:00 y las 20:59) entre 0 y 100 Cardinal
horario_noche Proporción de conexiones del usuario a la plataforma LMS moodle en horario de tarde (entre las 21:00 y las 6:59) entre 0 y 100 Cardinal
# se cargan los datos
vPath_moodle = "/media/pluto/departamentos/calidad/1_UDIMA/Medición y Análisis/Estudio segmentación de estudiantes/datos/dim_fotos_usuario/"

# se cargan los datos
moodle = read_delim(paste0(vPath_moodle,"dim_fotos_temporalidad_usuario_00.csv"),
                      delim = ";",
                      escape_double = FALSE,
                      col_types = cols(userid = col_skip(),
                                       porcentaje = col_skip(),
                                       semestre = col_skip()),
                    trim_ws = TRUE)

moodle2021 = read_delim(paste0(vPath_moodle,"dim_fotos_temporalidad_usuario.csv"),
                      delim = ",",
                      escape_double = FALSE,
                      col_types = cols(userid = col_skip(),
                                       porcentaje = col_skip(),
                                       semestre = col_skip()),
                    trim_ws = TRUE)

# se unen
moodle = rbind(moodle, moodle2021)

# se reducen dos franjas horarias
moodle$franja[moodle$franja == "mediodia"] = "tarde"
moodle$franja[moodle$franja == "madrugada"] = "noche"

# se obtienen totales por usuario y franja
moodle_totales_franja = moodle %>%
  group_by(id_usuldap = username,
           ano_academico,
           orden_periodo,
           total) %>%
  count() %>%
  group_by(id_usuldap) %>%
  summarise(total = sum(total))

# se calculan los totales por franja
moodle_franja = moodle %>%
  group_by(id_usuldap = username,
           franja) %>%
  summarise(cantidad = sum(cantidad))

# se cruzan
moodle_union = list(moodle_franja, moodle_totales_franja) %>% reduce(left_join)

# se transforman las variables cualitativas mediante la técnica One-Hot-Encoding, con la función dummy del paquete fastDummies al juego de datos inicial se añaden las columnas de la variables
moodle_union = dummy_cols(moodle_union, select_columns = c("franja"))

# se traslada la cantidad a la franja correspondiente
moodle_temporalidad = moodle_union %>%
  group_by(id_usuldap,
           total) %>%
  summarise(franja_laborable = ifelse(franja_laborable == 1,
                                      cantidad,
                                      NA),
            franja_festivo = ifelse(franja_festivo == 1,
                                    cantidad,
                                    NA),
            franja_mañana = ifelse(franja_mañana == 1,
                                   cantidad,
                                   NA),
            franja_tarde = ifelse(franja_tarde == 1,
                                  cantidad,
                                  NA),
            franja_noche = ifelse(franja_noche == 1,
                                  cantidad,
                                  NA))


# se calculan las cantidades totales de cada franja
moodle_temporalidad = moodle_temporalidad %>%
  group_by(id_usuldap,
           total) %>%
  summarise(franja_laborable = sum(franja_laborable, na.rm = TRUE),
            franja_festivo = sum(franja_festivo, na.rm = TRUE),
            franja_mañana = sum(franja_mañana, na.rm = TRUE),
            franja_tarde = sum(franja_tarde, na.rm = TRUE),
            franja_noche = sum(franja_noche, na.rm = TRUE))

# se calcula el porcentaje de cada franja
moodle_temporalidad = moodle_temporalidad %>%
  group_by(id_usuldap) %>%
  summarise(franja_laborable = round(100*franja_laborable/total, 2),
            franja_festivo = round(100*franja_festivo/total, 2),
            franja_mañana = round(100*franja_mañana/total, 2),
            franja_tarde = round(100*franja_tarde/total, 2),
            franja_noche = round(100*franja_noche/total, 2))
  

# se renombran las variables
names(moodle_temporalidad) = c("id_usuldap",  "dias_laborable", "dias_festivo", 
                               "horario_mañana", "horario_tarde", "horario_noche")

# se incluyen los datos de acceso a los de rto_total
rto_total = list(rto_total, moodle_temporalidad) %>% reduce(left_join)
# arreglo datos

# se excluyen los registros que provienen de 
rto_total = rto_total %>% 
  filter(!is.na(ste_codalf), # matrículas del curso actual (ste_codalf = NA) 
         !is.na(any_anyaca_inicio), # y sin curso de inicio identificado
         tasa_eficiencia <= 100, # planes que dependen de un doble grado
         t_evaluacion <= 100, # planes que dependen de un doble grado
         !is.na(acceso), # expedientes sin acceso identificado
         cen_codnum != 11282 # se excluye antigua Facultad
         )


# Se discretiza any_anyaca_acceso
rto_total$any_anyaca_acceso_dis = cut(as.numeric(substr(rto_total$any_anyaca_acceso,
                                                        start= 0, 
                                                        stop = 4)),
                                      breaks = c(1964, 1981, 1996, 2011, 2026), # cortes
                                      labels = c("1965-80", "1981-95", "1996-2010", "2011-25")) # nuevos valores


# any_anyaca_inicio
rto_total$any_anyaca_inicio_dis = cut(as.numeric(substr(rto_total$any_anyaca_inicio, 
                                                        start= 0, 
                                                        stop = 4)),
                                      breaks = c(2007, 2014, 2020, 2026), # cortes
                                      labels = c("2008-13", "2014-19", "2020-25")) # nuevos valores


# se exportan los datos
write_csv(rto_total, paste0(vPath_datos, "rto_total_identificacion.csv")) 
# Se cargan los datos de las transformaciones anteriores
vPath_datos = "/home/alejandra.bonilla/sincro/privado/MU_CienciaDatos_UOC/2022-23_1S/TFM/PEC3 - Diseño e implementación del trabajo/datos/"

rto_total = read_csv(paste0(vPath_datos, "rto_total_identificacion.csv"))

2.2.2 Verificación de la calidad de datos.

La calidad de los datos es elevada ya que:

  • la información de los atributos proviene del ERP de la organización, el cual no permite la carga de datos fuera de los criterios establecidos. Se comprueba que las variables tienen valores únicos, homogéneos y que concuerdan con la definición de variables:
# Se comprueba que las variables tienen valores únicos, homogéneos y que concuerdan con la definición de variables
# curso de inicio
sort(unique(rto_total$any_anyaca_inicio_dis))
## [1] "2008-13" "2014-19" "2020-25"
# tipo de estudios
sort(unique(rto_total$ste_codalf))
## [1] 0 1
  • en el caso de los estudios de satisfacción e inserción laboral, las variables objeto de estudio se han obtenido mediante formulario, lo que asegura que las respuestas numéricas o de opción múltiple queden recogidas de manera uniforme. Se comprueba que las variables tienen valores únicos, homogéneos y que concuerdan con la definición de variables:
# Se comprueba que las variables tienen valores únicos, homogéneos y que concuerdan con la definición de variables
# motivo estudios
sort(unique(rto_total$il_motivo_estudios))
## [1] 0 1
# recomendacion de estudios en encuesta de egresados
sort(unique(rto_total$sa_titulacion_recomendacion))
## [1]  50 100
  • Se compruebe que no haya valores extremos de las variables numéricas y que el rango esté contenido en el descrito para cada variable:
# Se crea un vector con las variables categóricas
var_caracter = c('cen_codnum',
                 'any_anyaca_acceso',
                 'any_anyaca_inicio')

# Se crea vector de variables numéricas a partir de las categóricas
no_pers = rto_total
no_pers$id_usuldap = NULL
no_pers$numdocsinletra = NULL
var_num = names(no_pers)[!names(no_pers) %in% var_caracter]

# Para las variables numéricas se estudian los valores extremos 
sapply(no_pers[, var_num], range, na.rm = TRUE)
##      est_codmec pla_codalf exp_numord ste_codalf sexo nacionalidad titulado
## [1,] "2500011"  "100"      "0"        "0"        "0"  "0"          "0"     
## [2,] "4317707"  "587"      "3552"     "1"        "1"  "1"          "3"     
##      tasa_eficiencia t_exito t_evaluacion t_rec    t_sup_req edad_inicio acceso
## [1,] "0"             "0"     "0"          "0"      "0"       "17"        "0"   
## [2,] "100"           "100"   "100"        "106.67" "166.67"  "78"        "1"   
##      complementos tasa_abandono traslado_expediente n_nodos_fin_titulacion
## [1,] "0"          "0"           "0"                 "0"                   
## [2,] "1"          "1"           "1"                 "4"                   
##      duracion_media_estudios nota_media sa_asig_R sa_asig_participacion
## [1,] "1"                     "2.075"    "0"       "0"                  
## [2,] "13"                    "10"       "1"       "100"                
##      sa_asig_organizacion sa_asig_manual sa_asig_materiales sa_asig_actividades
## [1,] "1"                  "1"            "1"                "1"                
## [2,] "5"                  "5"            "5"                "5"                
##      sa_asig_docente sa_asig_aprendiendo sa_asig_comentarios sa_curso_R
## [1,] "1"             "2.86"              "-0.8"              "0"       
## [2,] "5"             "100"               "1"                 "1"       
##      sa_curso_participacion sa_curso_nivel_academico sa_curso_implicacion
## [1,] "0"                    "1"                      "1"                 
## [2,] "100"                  "5"                      "5"                 
##      sa_curso_aprovechamiento_recursos sa_curso_titulacion
## [1,] "1"                               "1"                
## [2,] "5"                               "5"                
##      sa_curso_recomendacion sa_curso_comentarios sa_titulacion_R
## [1,] "25"                   "-1"                 "0"            
## [2,] "100"                  "1"                  "1"            
##      sa_titulacion_participacion sa_titulacion_nivel_academico
## [1,] "0"                         "1"                          
## [2,] "100"                       "5"                          
##      sa_titulacion_implicacion sa_titulacion_aprovechamiento_recursos
## [1,] "1"                       "1"                                   
## [2,] "5"                       "5"                                   
##      sa_titulacion_mejora_profesional sa_titulacion_obtener_trabajo
## [1,] "1"                              "1"                          
## [2,] "5"                              "5"                          
##      sa_titulacion_titulacion sa_titulacion_recomendacion
## [1,] "1"                      "50"                       
## [2,] "5"                      "100"                      
##      sa_titulacion_comentarios il_R il_participacion il_motivo_estudios
## [1,] "-1"                      "0"  "0"              "0"               
## [2,] "1"                       "1"  "100"            "1"               
##      il_consecuencia_estudios il_trabajo_actual
## [1,] "0"                      "0"              
## [2,] "1"                      "1"              
##      il_trabajo_actual_relacionado_estudios il_comentarios
## [1,] "0"                                    "-1"          
## [2,] "1"                                    "1"           
##      any_anyaca_acceso_dis any_anyaca_inicio_dis dias_laborable dias_festivo
## [1,] "1965-80"             "2008-13"             "0"            "0"         
## [2,] "2011-25"             "2020-25"             "100"          "100"       
##      horario_mañana horario_tarde horario_noche
## [1,] "0"            "0"           "0"          
## [2,] "100"          "100"         "100"

En el apartado Definición de variables ya se había indicado que t_rec y t_sup_req pueden superar el 100% ya que están calculadas frentes a los ECTS requeridos para finalizar la titulación, pero pueden superarse más ECTS de los requeridos (optativas, menciones, especialidades).

2.2.3 Exploración de los datos.

Se discretizan las variables categóricas para poder estudiar sus distribuciones y correlaciones, así como para tener identificadas las variables cualitativas/categóricas como variables discretas (factor).

# Se comprueba la distribución de valores mediante los estadísticos básicos de estas variables
summary(rto_total[, var_caracter])
##    cen_codnum    any_anyaca_acceso  any_anyaca_inicio 
##  Min.   :11416   Length:38864       Length:38864      
##  1st Qu.:11417   Class :character   Class :character  
##  Median :11417   Mode  :character   Mode  :character  
##  Mean   :11418                                        
##  3rd Qu.:11419                                        
##  Max.   :11420

Se comprueba la distribución de valores mediante boxplot de algunas variables numéricas.

# Aplicando la función melt del paquete reshape se transforman todas las variables en una única para poder aplicar la función boxplot de manera única y comparada (en la misma escala de valores)
boxplot(data = melt(rto_total[, var_num[1:20]]), 
        value~variable, 
        las = 2, 
        ylab = "Valores",
        xlab = "Variables",
        main = "Boxplot de variables numéricas", 
        col = "lightgreen")

Como hay variables numéricas en escalas muy dispares se va a comprobar la distribución de valores de variables numéricas similares, creando cuatro agrupaciones distintas: escala -1 a 1; escala 0 a 1; escala 0 a 10 y escala 0 a 100.

Se obtienen las siguientes conclusiones:

  • Escala -1:1: la connotación de los comentarios realizados por los estudiantes en los estudios de satisfacción e inserción laboral, excepto valores extremos, se consideran positivos;
# Se crea un vector de variables numericos escala -1:1
var_num_max_1 = c("sa_asig_comentarios", 
                  "sa_curso_comentarios", 
                  "sa_titulacion_comentarios", 
                  "il_comentarios")
  

# Aplicando la función melt del paquete reshape se transforman todas las variables en una única para poder aplicar la función boxplot de manera única y comparada (en la misma escala de valores)
boxplot(data = melt(rto_total[, var_num_max_1]), 
        value~variable, 
        las = 2, 
        ylab = "Valores",
        xlab = "Variables",
        main = "Boxplot de variables numéricas escala -1:1", 
        col = "lightgreen")

  • Escala 0 a 1: los valores extremos de estas variables están justificados al contar con una base de datos en la que se registran titulaciones de diferente duración (Grado y Máster).
# Se crea un vector de variables numericos escala 0 a 1
var_num_dicot = c("ste_codalf",
                  "sexo",
                  "nacionalidad",
                  "acceso",
                  "complementos",
                  "tasa_abandono",
                  "traslado_expediente",
                  "sa_asig_R",
                  "sa_curso_R",
                  "sa_titulacion_R",
                  "il_R",
                  "il_motivo_estudios",
                  "il_consecuencia_estudios",
                  "il_trabajo_actual",
                  "il_trabajo_actual_relacionado_estudios")    

# Aplicando la función melt del paquete reshape se transforman todas las variables en una única para poder aplicar la función boxplot de manera única y comparada (en la misma escala de valores)
boxplot(data = melt(rto_total[, var_num_dicot]), 
        value~variable, 
        las = 2, 
        ylab = "Valores",
        xlab = "Variables",
        main = "Boxplot de variables numéricas escala 0 a 1", 
        col = "lightgreen")

  • Escala 0 y próximo a 10: la media de titulados y número de especialidades obtenidas es 1, con algunos valores extremos superiores; la duración media de los estudios es 2 años de media, aunque hay valores extremos superiores; la nota media es ligeramente inferior a 8; y la mayoría de ítems de encuestas están valorados entre 4 y 5, con algunos valores extremos inferiores.
# Se crea un vector de variables numericos escala 0:10
var_num_1_10 = c("titulado",
                "n_nodos_fin_titulacion",
                "duracion_media_estudios",
                "nota_media",
                "sa_asig_organizacion",
                "sa_asig_manual",
                "sa_asig_materiales",
                "sa_asig_actividades",
                "sa_asig_docente",
                "sa_curso_nivel_academico",
                "sa_curso_implicacion",
                "sa_curso_aprovechamiento_recursos",
                "sa_curso_titulacion",
                "sa_titulacion_nivel_academico",
                "sa_titulacion_implicacion",
                "sa_titulacion_aprovechamiento_recursos",
                "sa_titulacion_mejora_profesional",
                "sa_titulacion_obtener_trabajo",
                "sa_titulacion_titulacion")

# Aplicando la función melt del paquete reshape se transforman todas las variables en una única para poder aplicar la función boxplot de manera única y comparada (en la misma escala de valores)
boxplot(data = melt(rto_total[, var_num_1_10]), 
        value~variable, 
        las = 2, 
        ylab = "Valores",
        xlab = "Variables",
        main = "Boxplot de variables numéricas escala 0 y próximo a 10", 
        col = "lightgreen")

  • Escala 0:100: la edad media de inicio es inferior a los 25 años, mientras que la de finalización es superior y el rango se amplía (afectan titulaciones de Grado y Máster, por lo que se considera normal y hay valores extremos superiores); la participación en las encuestas es reducida, inferior al 50%; el estudiantado manifiesta un alto porcentaje de aprendizaje y grado de recomendación; los resultados de la tasa de eficiencia son muy positivos, superiores al 75 y con valores extremos inferiores por debajo de 30; predomina la conexión a moodle entre diario (lunes a viernes) y por la tarde (entre las 13:00 y las 20:59).

De nuevo, se recuerda que en el apartado Definición de variables ya se había indicado que t_rec y t_sup_req pueden superar el 100% ya que están calculadas frentes a los ECTS requeridos para finalizar la titulación, pero pueden superarse más ECTS de los requeridos (optativas, menciones, especialidades).

# Se crea un vector de variables numericos escala 0-100
var_num_0_100 = c("edad_inicio",
                  "tasa_eficiencia",
                  "t_exito",
                  "t_evaluacion",
                  "t_rec",
                  "t_sup_req",
                  "sa_asig_participacion",
                  "sa_curso_participacion",
                  "sa_titulacion_participacion",
                  "il_participacion" ,
                  "sa_asig_aprendiendo",
                  "sa_curso_recomendacion", 
                  "sa_titulacion_recomendacion",
                  "dias_laborable",
                  "dias_festivo",
                  "horario_mañana",
                  "horario_tarde",
                  "horario_noche")

# Aplicando la función melt del paquete reshape se transforman todas las variables en una única para poder aplicar la función boxplot de manera única y comparada (en la misma escala de valores)
boxplot(data = melt(rto_total[, var_num_0_100]), 
        value~variable, 
        las = 2, 
        ylab = "Valores",
        xlab = "Variables",
        main = "Boxplot de variables numéricas escala 0-100", 
        col = "lightgreen")

Para proceder con el análisis de correlaciones es necesario realizar transformaciones a las variables cualitativas anteriores por lo que en la Fase siguiente se realizarán tanto las transformaciones como el análisis de correlaciones.

2.3 Fase III. Data Preparation o análisis de los datos y selección de características.

El objetivo de esta fase es preparar los datos para asegurar la calidad de los mismos según las conclusiones y/o necesidades detectadas en la fase anterior (Fase II) así como la obtención de conclusiones del estudio de correlaciones. Es decir, en esta fase, a los datos iniciales (input) se aplican algunas operaciones de limpieza, normalización, discretización y reducción de dimensionalidad para obtener unos datos de calidad (output) que permitirán la siguiente fase de modelado (Fase IV).

Para ello se van a llevar a cabo las siguientes acciones:

  • Síntesis de las tareas de limpieza y acondicionado realizadas en fases previas (imputación de datos ausentes).

  • Transformación de las variables cualitativas mediante la técnica One-Hot-Encoding.

  • Estudio de correlaciones entre variables cuantitativas y variables cualitativas transformadas, extrayendo conclusiones.

2.3.1 Tareas de limpieza y acondicionado.

A lo largo del desarrollo del trabajo se han ido introduciendo tareas de limpieza y acondicionado. Algunas de ellas se encuentran incluso en la fase de construcción de los históricos de resultados. A continuación se resumen las acciones realizadas hasta este punto del proyecto:

  • En la construcción de los históricos de resultados se han asociado los valores ausentes “” a NA y las variables se han convertido al tipo de datos oportuno (numérico, factor, etc.).

  • En la Fase II, y previa a la descripción de variables del juego de datos, se ha ido revisando que las variables con datos ausentes guarden una lógica con el aspecto a estudiar (progreso académico del estudiantado, que puede o no participar en las encuestas y que ha podido finalizar, abandonar o progresar en el estudio).

  • En la presente Fase se comprueba la cantidad de datos ausentes por variable.

# se visualiza 
colSums(is.na(rto_total))
##                             est_codmec                             pla_codalf 
##                                      0                                      0 
##                             exp_numord                             id_usuldap 
##                                      0                                      0 
##                         numdocsinletra                             ste_codalf 
##                                      0                                      0 
##                             cen_codnum                                   sexo 
##                                      0                                      0 
##                           nacionalidad                      any_anyaca_acceso 
##                                      0                                      0 
##                      any_anyaca_inicio                               titulado 
##                                      0                                      0 
##                        tasa_eficiencia                                t_exito 
##                                      0                                      0 
##                           t_evaluacion                                  t_rec 
##                                      0                                      0 
##                              t_sup_req                            edad_inicio 
##                                      0                                      0 
##                                 acceso                           complementos 
##                                      0                                      0 
##                          tasa_abandono                    traslado_expediente 
##                                      0                                      0 
##                 n_nodos_fin_titulacion                duracion_media_estudios 
##                                      0                                      0 
##                             nota_media                              sa_asig_R 
##                                   2981                                   7433 
##                  sa_asig_participacion                   sa_asig_organizacion 
##                                   7433                                  27938 
##                         sa_asig_manual                     sa_asig_materiales 
##                                  25817                                  27977 
##                    sa_asig_actividades                        sa_asig_docente 
##                                  25819                                  25809 
##                    sa_asig_aprendiendo                    sa_asig_comentarios 
##                                  31120                                  31992 
##                             sa_curso_R                 sa_curso_participacion 
##                                  16495                                  16495 
##               sa_curso_nivel_academico                   sa_curso_implicacion 
##                                  31350                                  32857 
##      sa_curso_aprovechamiento_recursos                    sa_curso_titulacion 
##                                  31316                                  31341 
##                 sa_curso_recomendacion                   sa_curso_comentarios 
##                                  32831                                  35293 
##                        sa_titulacion_R            sa_titulacion_participacion 
##                                  20609                                  20609 
##          sa_titulacion_nivel_academico              sa_titulacion_implicacion 
##                                  36577                                  36975 
## sa_titulacion_aprovechamiento_recursos       sa_titulacion_mejora_profesional 
##                                  36558                                  35560 
##          sa_titulacion_obtener_trabajo               sa_titulacion_titulacion 
##                                  37190                                  34977 
##            sa_titulacion_recomendacion              sa_titulacion_comentarios 
##                                  37014                                  37486 
##                                   il_R                       il_participacion 
##                                  18155                                  18155 
##                     il_motivo_estudios               il_consecuencia_estudios 
##                                  36057                                  36443 
##                      il_trabajo_actual il_trabajo_actual_relacionado_estudios 
##                                  36044                                  36733 
##                         il_comentarios                  any_anyaca_acceso_dis 
##                                  38390                                      0 
##                  any_anyaca_inicio_dis                         dias_laborable 
##                                      0                                   3689 
##                           dias_festivo                         horario_mañana 
##                                   3689                                   3689 
##                          horario_tarde                          horario_noche 
##                                   3689                                   3689

Se decide imputar datos en función del significado de las variables: algunas de ellas, al no tener valor, se imputa 0; y otras, que su valor es desconocido, principalmente porque el estudiante no ha participado en las encuestas, se imputa la mediana (métrica robusta a los outliers).

  • Se imputa 0 en las variables que aún no han registrado valor:

  • sa_titulacion_participacion y sa_titulacion_R total del estudiantado que no ha egresado ni participado en el estudio;

  • il_participacion e il_R total del estudiantado que no ha egresado ni participado en el estudio;

  • sa_asig_comentarios, sa_curso_comentarios, sa_titulacion_comentarios, il_comentarios si no se han registrado comentarios en las encuestas (el valor 0 aporta connotación neutra en los sentimientos expresados);

  • il_motivo_estudios, il_consecuencia_estudios, il_trabajo_actual, il_trabajo_actual_relacionado_estudios la variables dicotómicas del estudio de inserción se imputa el valor ‘No’ = 0.

Nota: a diferencia de sa_asig_participacion y sa_curso_participacion, donde se imputará le mediana porque los históricos correspondientes no comprenden todos los cursos académicos (desde 2012-13 y 2017-18, respectivamente), en los datos ausentes de la participación en las encuestas/estudios a egresados (sa_titulacion_participacion y il_participacion) sí se imputa 0 dado que se ha realizado dichos estudios a todos los egresados hasta la fecha, por lo que, si no han egresado, su participación en el mismo ha de ser 0%.

  • Se imputa la mediana (métrica robusta a los outliers) a las variables que, pese a no tener valor, imputar 0 como en el caso anterior supondría tener el peor valor posible del aspecto medido:

  • nota_media: hay estudiantes, en progreso o que han abandonado que hasta el momento no han registrado calificaciones;

  • sa_asig_participacion total del estudiantado que su participación no está recogida en el histórico (se recuerda que este no cuenta con datos anteriores a 2012-13. Esto se considera una limitación);

  • sa_curso_participacion total del estudiantado que su participación no está recogida en el histórico (se recuerda que el estudio se inició en 2017-18. Esto se considera una limitación);

  • los distintos ítems de las encuestas de satisfacción de asignaturas (sa_asig_organizacion, sa_asig_manual, sa_asig_materiales, sa_asig_actividades, sa_asig_docente, sa_asig_aprendiendo) tienen distinto nivel de participación debido a que el formato ha variado en el tiempo y no es obligatorio responder a ningún ítem;

  • los distintos ítems de las encuestas de satisfacción con el curso (sa_curso_nivel_academico, sa_curso_implicacion, sa_curso_aprovechamiento_recursos, sa_curso_titulacion, sa_curso_recomendacion) tienen distinto nivel de participación debido a que el formato ha variado en el tiempo y no es obligatorio responder a ningún ítem;

  • los distintos ítems de las encuestas de satisfacción de egresados con la titulaciones (sa_titulacion_nivel_academico, sa_titulacion_implicacion, sa_titulacion_aprovechamiento_recursos, sa_titulacion_mejora_profesional, sa_titulacion_obtener_trabajo, sa_titulacion_titulacion, sa_titulacion_recomendacion) tienen distinto nivel de participación debido a que el formato ha variado en el tiempo y no es obligatorio responder a ningún ítem;

  • las variables de utilización de la plataforma de formación moodle (dias_laborable, dias_festivo, horario_madrugada, horario_mañana, horario_tarde, horario_noche) coinciden en valores, total del estudiantado que no ha registrado movimiento en moodle entre los cursos recogidos (“2012-13” a “2020-21”). Esto se considera una limitación.

Tras la imputación, se comprueba de nuevo la distribución de los datos y la no existencia de datos ausentes.

# sobre los valores ausentes se gestionan, por un lado, la imputación de 0 y de la mediana
v_imput_0 = c('sa_titulacion_R', 'sa_titulacion_participacion', 
              # inserción laboral
              'il_R', 'il_participacion',
              # comentarios en encuestas (0 valor neutro)
              'sa_asig_comentarios', 'sa_curso_comentarios', 'sa_titulacion_comentarios', 'il_comentarios',
              # insercion laboral (variables dicotómicas)
              'il_motivo_estudios', 'il_consecuencia_estudios', 'il_trabajo_actual',
              'il_trabajo_actual_relacionado_estudios')


v_imput_mediana = c('nota_media',
                    # encuesta asginatura
                    'sa_asig_organizacion', 'sa_asig_manual', 'sa_asig_materiales', 'sa_asig_actividades',
                    'sa_asig_docente', 'sa_asig_aprendiendo', 
                    # encuesta curso
                    'sa_curso_nivel_academico', 'sa_curso_implicacion', 'sa_curso_aprovechamiento_recursos', 
                    'sa_curso_titulacion', 'sa_curso_recomendacion', 
                    # encuesta egresados
                    'sa_titulacion_nivel_academico', 'sa_titulacion_implicacion', 'sa_titulacion_aprovechamiento_recursos', 
                    'sa_titulacion_mejora_profesional', 'sa_titulacion_obtener_trabajo', 'sa_titulacion_titulacion',
                    'sa_titulacion_recomendacion', 
                    # moodle
                    'dias_laborable', 'dias_festivo', 'horario_mañana', 'horario_tarde', 'horario_noche', 
                    # encuesta asginatura
                    'sa_asig_R','sa_asig_participacion',
                    # encuesta curso
                    'sa_curso_R', 'sa_curso_participacion')

# se imputa la mediana
rto_total = rto_total %>% mutate(across(v_imput_mediana, 
                                        ~replace_na(., median(., na.rm=TRUE))))

# se imputa 0
rto_total = rto_total %>% mutate(across(v_imput_0, 
                                        ~replace_na(., 0)))



# Se comprueba que no haya valores nulos 
colSums(is.na(rto_total))
##                             est_codmec                             pla_codalf 
##                                      0                                      0 
##                             exp_numord                             id_usuldap 
##                                      0                                      0 
##                         numdocsinletra                             ste_codalf 
##                                      0                                      0 
##                             cen_codnum                                   sexo 
##                                      0                                      0 
##                           nacionalidad                      any_anyaca_acceso 
##                                      0                                      0 
##                      any_anyaca_inicio                               titulado 
##                                      0                                      0 
##                        tasa_eficiencia                                t_exito 
##                                      0                                      0 
##                           t_evaluacion                                  t_rec 
##                                      0                                      0 
##                              t_sup_req                            edad_inicio 
##                                      0                                      0 
##                                 acceso                           complementos 
##                                      0                                      0 
##                          tasa_abandono                    traslado_expediente 
##                                      0                                      0 
##                 n_nodos_fin_titulacion                duracion_media_estudios 
##                                      0                                      0 
##                             nota_media                              sa_asig_R 
##                                      0                                      0 
##                  sa_asig_participacion                   sa_asig_organizacion 
##                                      0                                      0 
##                         sa_asig_manual                     sa_asig_materiales 
##                                      0                                      0 
##                    sa_asig_actividades                        sa_asig_docente 
##                                      0                                      0 
##                    sa_asig_aprendiendo                    sa_asig_comentarios 
##                                      0                                      0 
##                             sa_curso_R                 sa_curso_participacion 
##                                      0                                      0 
##               sa_curso_nivel_academico                   sa_curso_implicacion 
##                                      0                                      0 
##      sa_curso_aprovechamiento_recursos                    sa_curso_titulacion 
##                                      0                                      0 
##                 sa_curso_recomendacion                   sa_curso_comentarios 
##                                      0                                      0 
##                        sa_titulacion_R            sa_titulacion_participacion 
##                                      0                                      0 
##          sa_titulacion_nivel_academico              sa_titulacion_implicacion 
##                                      0                                      0 
## sa_titulacion_aprovechamiento_recursos       sa_titulacion_mejora_profesional 
##                                      0                                      0 
##          sa_titulacion_obtener_trabajo               sa_titulacion_titulacion 
##                                      0                                      0 
##            sa_titulacion_recomendacion              sa_titulacion_comentarios 
##                                      0                                      0 
##                                   il_R                       il_participacion 
##                                      0                                      0 
##                     il_motivo_estudios               il_consecuencia_estudios 
##                                      0                                      0 
##                      il_trabajo_actual il_trabajo_actual_relacionado_estudios 
##                                      0                                      0 
##                         il_comentarios                  any_anyaca_acceso_dis 
##                                      0                                      0 
##                  any_anyaca_inicio_dis                         dias_laborable 
##                                      0                                      0 
##                           dias_festivo                         horario_mañana 
##                                      0                                      0 
##                          horario_tarde                          horario_noche 
##                                      0                                      0

2.3.2 Transformación de las variables cualitativas.

Se busca que los datos estén en la forma adecuada (variación entre la forma de recogida y explotación concreta, aplicando técnicas de normalización y/o discretización).

Para poder realizar una correlación entre variables cualitativas y cuantitativas se procede a transformar las variables cualitativas mediante la técnica One-Hot-Encoding, con la función dummy_cols del paquete fastDummies.

Esta técnica crea una variable para cada valor de una variable categórica indicando 1 si la variable toma el valor x y 0 si no. Por ejemplo, en el caso de la variable sexo que toma el valor Hombre/Mujer, mediante la aplicación de esta técnica se generarán dos nuevas variables:

  • sexo_Hombre: tomando el valor 1 para los registros que en la variable sexo toman el valor “Hombre” y 0 para los que toman en valor “Mujer”.

  • sexo_Mujer: en este caso, al contrario que en la variable anterior, la nueva variable tomará el valor 1 para los registros que toman el valor “Mujer” en la variable primitiva y el valor 0 para los que toman el valor “Hombre”.

# para poder trabajar con la fuente de datos a estudiar (sin ningún tipo de identificación)

# se excluyen las variables identificativas
data = rto_total

data$est_codmec = NULL
data$pla_codalf = NULL
data$exp_numord = NULL
data$id_usuldap = NULL
data$numdocsinletra = NULL
data$any_anyaca_acceso = data$any_anyaca_acceso_dis
data$any_anyaca_inicio = data$any_anyaca_inicio_dis
data$any_anyaca_acceso_dis = NULL
data$any_anyaca_inicio_dis = NULL

# se exportan los datos
write_csv(data, paste0(vPath_datos, "rto_total_limpio.csv")) 
# Se crea df auxiliar al que añadir las nuevas variables
data_dummy = dummy_cols(data, select_columns = var_caracter)

# Del dataset con variables dummy se eliminan las que no lo son
data_dummy = select(data_dummy,
                    -var_caracter)

# dimensiones pre
print(paste0("Las dimensiones de este juego de datos sin aplicar la técnica 'One-Hot-Encoding' son: ",
             dim(data)[1], " registros y ",
             dim(data)[2], " variables. Al aplicarla, las dimensiones aumentan a: ",
             dim(data_dummy)[1], " registros y ",
             dim(data_dummy)[2], " variables."))
## [1] "Las dimensiones de este juego de datos sin aplicar la técnica 'One-Hot-Encoding' son: 38864 registros y 59 variables. Al aplicarla, las dimensiones aumentan a: 38864 registros y 68 variables."

2.3.3 Descripción de variables.

Como se ha comentado en la fase de recopilación de datos, la construcción del juego de datos proviene del cruce de distintas fuentes, dando lugar a la suma de todas las variables anteriormente descritas y relacionadas.

A continuación se describen las variables contenidas en el juego de datos y el rango de valores que permiten:

Variables que la componen:

Variable Descripción Valores Tipo Explotación
ste_codalf Tipo de estudios 0: Grado, 1: Máster Cardinal
est_codmec Código MEC plan 7 caracteres numéricos Categórica No, identificativo
cen_codnum Código MEC centro 5 caracteres numéricos Categórica
pla_codalf Código plan 3 caracteres numéricos Categórica No, identificativo
exp_numord Número de expediente Numérico Categórica No, identificativo
sexo Sexo 1: Mujer, 0: Hombre Cardinal
edad_inicio Edad inicio estudios >0 Cardinal
id_usuldap Usuario del campus alfanumérico Categórica No, identificativo
nacionalidad 1ª Nacionalidad 1: española, 0: no Cardinal
numdocsinletra Nº documento alfanumérico Categórica No, identificativo
any_anyaca_acceso Curso de vía acceso Discretizada: ‘1965-80’; ‘1981-95’; ‘1996-2010’; ‘2011-25’ Categórica
any_anyaca_inicio Curso inicio estudios Discretizada: ‘2008-13’; ‘2014-19’; ‘2020-25’ Categórica
titulado Titulación finalizada >=0 Cardinal
tasa_eficiencia 100*ECTS superados/matriculados >=0 Cardinal
t_exito 100*ECTS superados/presentados >=0 Cardinal
t_evaluacion 100*ECTS presentados/matriculados >=0 Cardinal
t_rec 100*ECTS reconocidos/total a superar >=0 Cardinal
t_sup_req 100*ECTS (superados+reconocidos)/total a superar >=0 Cardinal
acceso Tipo acceso presentado 1: Titulado Universitario, 0: No Cardinal
complementos Requiere complementos 1: Sí, 0: No Cardinal
traslado_expediente Traslado de expediente 1: Sí, 0: No Cardinal
n_nodos_fin_titulacion Nº de nodos de finalización (si >1, distintas especialidades) >=0 Cardinal
duracion_media_estudios Número de cursos donde formaliza matrícula. >=0 Cardinal
tasa_abandono 0: si se titula, no se traslada y tiene matrícula activa en dos últimos cursos; 1: en el resto de casos 1: Sí, 0: No Cardinal
nota_media Media ponderada ECTS superados en Udima >=0 Cardinal
sa_asig_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_asig_participacion Proporción de encuestas respondidas por el estudiante en las asignaturas del plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_asig_organizacion Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem La organización de la asignatura facilita el aprendizaje de esta asignatura. Escala 1-5 >=1 y <= 5 Cardinal
sa_asig_manual Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem El manual facilita el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_materiales Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem Otros materiales didácticos aportados facilitan el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_actividades Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem Las actividades didácticas planteadas facilitan el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_docente Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem La labor del docente facilita el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_aprendiendo Porcentaje de respuestas al ítem ¿Consideras que estás aprendiendo? respecto de las encuestas respondidas por el estudiante en las asignaturas entre 0 y 1 Cardinal
sa_asig_comentarios Promedio de la connotación del contenido de los comentarios realizados por el estudiante en las encuestas de las asignaturas entre -1 y 1 Cardinal
sa_curso_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_curso_participacion Proporción de encuestas respondidas por el estudiante en los cursos matriculados en el plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_curso_nivel_academico Promedio de valoraciones aportadas por el estudiante en los cursos matriculados en el plan para el ítem ‘Mi nivel académico y de conocimientos a la hora de afrontar los estudios’. Escala 1-5 >=1 y <= 5 Cardinal
sa_curso_implicacion Promedio de valoraciones aportadas por el estudiante en los cursos matriculados en el plan para el ítem ‘Mi implicación con los estudios’. Escala 1-5 >=1 y <= 5 Cardinal
sa_curso_aprovechamiento_recursos Promedio de valoraciones aportadas por el estudiante en los cursos matriculados en el plan para el ítem ‘Mi aprovechamiento de los recursos didácticos disponibles’. Escala 1-5 >=1 y <= 5 Cardinal
sa_curso_titulacion Promedio de valoraciones aportadas por el estudiante en los cursos matriculados en el plan para el ítem ‘Grado de satisfacción general con la titulación’. Escala 1-5 >=1 y <= 5 Cardinal
sa_curso_recomendacion Proporción de respuestas al ítem ¿Recomendarías estudiar en la Udima a otra persona? respecto de las encuestas respondidas por el estudiante en los cursos matriculados en el plan entre 0 y 1 Cardinal
sa_curso_comentarios Promedio de la connotación del contenido de los comentarios realizados por el estudiante en las encuestas de curso entre -1 y 1 Cardinal
sa_titulacion_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_titulacion_participacion Proporción de encuestas respondidas por el egresado en los cursos de egreso en el plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_titulacion_nivel_academico Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘Mi nivel académico y de conocimientos a la hora de afrontar los estudios’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_implicacion Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘Mi implicación con los estudios’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_aprovechamiento_recursos Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘Mi aprovechamiento de los recursos didácticos disponibles’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_mejora_profesional Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘La titulación obtenida ha supuesto una mejora profesional’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_obtener_trabajo Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘La titulación obtenida ha supuesto obtener un puesto de trabajo’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_titulacion Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘Grado de satisfacción general con la titulación’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_recomendacion Proporción de respuestas al ítem ¿Recomendarías estudiar en la Udima a otra persona? respecto de las encuestas respondidas por el estudiante en los cursos egresados en el plan entre 0 y 1 Cardinal
sa_titulacion_comentarios Promedio de la connotación del contenido de los comentarios realizados por el estudiante egresado en las encuestas del título entre -1 y 1 Cardinal
il_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
il_participacion Proporción de encuestas respondidas por el egresado en los cursos de egreso y estudios en el plan respecto de las que han sido enviadas (estudios tipo I y II, realizados respectivamente, al año y dos años de egresar) entre 0 y 1 Cardinal
il_motivo_estudios Valoración aportada por el egresado en los estudios tipo I y II en el plan para el ítem ¿Por qué realizaste tus estudios en UDIMA? 1: Mejora laboral; 0: Otros Cardinal
il_consecuencia_estudios Valoración aportada por el egresado en los estudios tipo I y II en el plan para el ítem ¿Qué ha supuesto la realización de los estudios? 1: Conseguir o mejorar un empleo; 0: No variación u Otro Cardinal
il_trabajo_actual Valoración aportada por el egresado en los estudios tipo I y II en el plan para el ítem ¿Trabajas actualmente? Sí; No Cardinal
il_trabajo_actual_relacionado_estudios Valoración aportada por el egresado en los estudios tipo I y II en el plan para el ítem ¿Trabajas actualmente en alguna actividad relacionada con los estudios finalizados? Sí; No Cardinal
il_comentarios Promedio de la connotación del contenido de los comentarios realizados por el estudiante egresado en el estudio de inserción laboral del título entre -1 y 1 Cardinal
dias_laborable Proporción de conexiones del usuario a la plataforma LMS moodle en días de diario (lunes a viernes) entre 0 y 100 Cardinal
dias_festivo Proporción de conexiones del usuario a la plataforma LMS moodle en días festivos (sábado y domingo) entre 0 y 100 Cardinal
horario_mañana Proporción de conexiones del usuario a la plataforma LMS moodle en horario de mañana (entre las 7:00 y las 12:59) entre 0 y 100 Cardinal
horario_tarde Proporción de conexiones del usuario a la plataforma LMS moodle en horario de tarde (entre las 13:00 y las 20:59) entre 0 y 100 Cardinal
horario_noche Proporción de conexiones del usuario a la plataforma LMS moodle en horario de tarde (entre las 21:00 y las 6:59) entre 0 y 100 Cardinal

Nota: Se recuerda que t_rec y t_sup_req pueden superar el 100% ya que están calculadas frentes a los ECTS requeridos para finalizar la titulación, pero pueden superarse más ECTS de los requeridos (optativas, menciones, especialidades, etc.).

Representatividad de la muestra (determina si la muestra es estadísticamente significativa): Dado que las respuestas recibidas responden a un muestreo se determina la obtención de muestra representativa mediante la fórmula:

\[Muestra\ representativa\ (n)\ = \frac{\frac{z^{2}\ p\ (1-p)\ }{e^{2}}}{1 + \frac{z^{2}\ p\ (1-p)\ }{e^{2} N\ }}\]

Siendo:

  • Nivel de confianza (NC) del 80%, lo que implica Z-score (z) de 1.282.

  • Proporción esperada (p): para maximizar el tamaño muestral será de 0.5 (50%).

  • Error muestral (e) del 10%.

  • Población (N): cantidad total de usuarios a los que se invita a participar en el estudio.

2.3.4 Definición de los juegos de datos.

Para poder llevar a cabo el desarrollo de los distintos objetivos específicos es necesario obtener distintas bases de datos:

2.3.4.1 Definición del estudiantado.

Esta fuente de datos recoge todas las variables definidas hasta el momento sin restringirse a ningún perfil de estudiante.

# se visualiza 
summary(data_dummy)
##    ste_codalf          sexo         nacionalidad       titulado     
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:1.0000   1st Qu.:0.0000  
##  Median :1.0000   Median :1.0000   Median :1.0000   Median :1.0000  
##  Mean   :0.6777   Mean   :0.5605   Mean   :0.8799   Mean   :0.5897  
##  3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :3.0000  
##  tasa_eficiencia     t_exito        t_evaluacion        t_rec        
##  Min.   :  0.00   Min.   :  0.00   Min.   :  0.00   Min.   :  0.000  
##  1st Qu.: 74.07   1st Qu.: 94.74   1st Qu.: 83.33   1st Qu.:  0.000  
##  Median :100.00   Median :100.00   Median :100.00   Median :  0.000  
##  Mean   : 80.27   Mean   : 87.46   Mean   : 84.32   Mean   :  7.257  
##  3rd Qu.:100.00   3rd Qu.:100.00   3rd Qu.:100.00   3rd Qu.: 10.000  
##  Max.   :100.00   Max.   :100.00   Max.   :100.00   Max.   :106.670  
##    t_sup_req       edad_inicio        acceso        complementos    
##  Min.   :  0.00   Min.   :17.00   Min.   :0.0000   Min.   :0.00000  
##  1st Qu.: 42.50   1st Qu.:25.00   1st Qu.:1.0000   1st Qu.:0.00000  
##  Median :100.00   Median :29.00   Median :1.0000   Median :0.00000  
##  Mean   : 75.44   Mean   :31.05   Mean   :0.7728   Mean   :0.08617  
##  3rd Qu.:100.00   3rd Qu.:36.00   3rd Qu.:1.0000   3rd Qu.:0.00000  
##  Max.   :166.67   Max.   :78.00   Max.   :1.0000   Max.   :1.00000  
##  tasa_abandono    traslado_expediente n_nodos_fin_titulacion
##  Min.   :0.0000   Min.   :0.00000     Min.   :0.0000        
##  1st Qu.:0.0000   1st Qu.:0.00000     1st Qu.:0.0000        
##  Median :0.0000   Median :0.00000     Median :1.0000        
##  Mean   :0.2101   Mean   :0.01508     Mean   :0.6164        
##  3rd Qu.:0.0000   3rd Qu.:0.00000     3rd Qu.:1.0000        
##  Max.   :1.0000   Max.   :1.00000     Max.   :4.0000        
##  duracion_media_estudios   nota_media       sa_asig_R     
##  Min.   : 1.000          Min.   : 2.075   Min.   :0.0000  
##  1st Qu.: 1.000          1st Qu.: 7.320   1st Qu.:0.0000  
##  Median : 2.000          Median : 7.890   Median :0.0000  
##  Mean   : 1.959          Mean   : 7.836   Mean   :0.1192  
##  3rd Qu.: 2.000          3rd Qu.: 8.400   3rd Qu.:0.0000  
##  Max.   :13.000          Max.   :10.000   Max.   :1.0000  
##  sa_asig_participacion sa_asig_organizacion sa_asig_manual  sa_asig_materiales
##  Min.   :  0.00        Min.   :1.000        Min.   :1.000   Min.   :1.000     
##  1st Qu.:  0.00        1st Qu.:4.330        1st Qu.:4.000   1st Qu.:4.200     
##  Median :  0.00        Median :4.330        Median :4.000   Median :4.200     
##  Mean   : 19.64        Mean   :4.299        Mean   :3.998   Mean   :4.166     
##  3rd Qu.: 30.77        3rd Qu.:4.330        3rd Qu.:4.000   3rd Qu.:4.200     
##  Max.   :100.00        Max.   :5.000        Max.   :5.000   Max.   :5.000     
##  sa_asig_actividades sa_asig_docente sa_asig_aprendiendo sa_asig_comentarios
##  Min.   :1.000       Min.   :1.000   Min.   :  2.86      Min.   :-0.80000   
##  1st Qu.:4.270       1st Qu.:4.440   1st Qu.: 90.91      1st Qu.: 0.00000   
##  Median :4.270       Median :4.440   Median : 90.91      Median : 0.00000   
##  Mean   :4.229       Mean   :4.381   Mean   : 88.47      Mean   : 0.02511   
##  3rd Qu.:4.270       3rd Qu.:4.440   3rd Qu.: 90.91      3rd Qu.: 0.00000   
##  Max.   :5.000       Max.   :5.000   Max.   :100.00      Max.   : 1.00000   
##    sa_curso_R     sa_curso_participacion sa_curso_nivel_academico
##  Min.   :0.0000   Min.   :  0.00         Min.   :1.000           
##  1st Qu.:0.0000   1st Qu.:  0.00         1st Qu.:4.000           
##  Median :0.0000   Median :  0.00         Median :4.000           
##  Mean   :0.1106   Mean   : 15.19         Mean   :4.011           
##  3rd Qu.:0.0000   3rd Qu.:  0.00         3rd Qu.:4.000           
##  Max.   :1.0000   Max.   :100.00         Max.   :5.000           
##  sa_curso_implicacion sa_curso_aprovechamiento_recursos sa_curso_titulacion
##  Min.   :1.000        Min.   :1.000                     Min.   :1.000      
##  1st Qu.:4.670        1st Qu.:4.000                     1st Qu.:4.000      
##  Median :4.670        Median :4.000                     Median :4.000      
##  Mean   :4.629        Mean   :4.014                     Mean   :3.976      
##  3rd Qu.:4.670        3rd Qu.:4.000                     3rd Qu.:4.000      
##  Max.   :5.000        Max.   :5.000                     Max.   :5.000      
##  sa_curso_recomendacion sa_curso_comentarios sa_titulacion_R 
##  Min.   : 25.00         Min.   :-1.000000    Min.   :0.0000  
##  1st Qu.:100.00         1st Qu.: 0.000000    1st Qu.:0.0000  
##  Median :100.00         Median : 0.000000    Median :0.0000  
##  Mean   : 99.44         Mean   : 0.008141    Mean   :0.1002  
##  3rd Qu.:100.00         3rd Qu.: 0.000000    3rd Qu.:0.0000  
##  Max.   :100.00         Max.   : 1.000000    Max.   :1.0000  
##  sa_titulacion_participacion sa_titulacion_nivel_academico
##  Min.   :  0.00              Min.   :1.000                
##  1st Qu.:  0.00              1st Qu.:4.000                
##  Median :  0.00              Median :4.000                
##  Mean   : 10.05              Mean   :4.008                
##  3rd Qu.:  0.00              3rd Qu.:4.000                
##  Max.   :100.00              Max.   :5.000                
##  sa_titulacion_implicacion sa_titulacion_aprovechamiento_recursos
##  Min.   :1.000             Min.   :1.000                         
##  1st Qu.:5.000             1st Qu.:4.000                         
##  Median :5.000             Median :4.000                         
##  Mean   :4.976             Mean   :4.011                         
##  3rd Qu.:5.000             3rd Qu.:4.000                         
##  Max.   :5.000             Max.   :5.000                         
##  sa_titulacion_mejora_profesional sa_titulacion_obtener_trabajo
##  Min.   :1.000                    Min.   :1.000                
##  1st Qu.:4.000                    1st Qu.:3.000                
##  Median :4.000                    Median :3.000                
##  Mean   :3.967                    Mean   :3.002                
##  3rd Qu.:4.000                    3rd Qu.:3.000                
##  Max.   :5.000                    Max.   :5.000                
##  sa_titulacion_titulacion sa_titulacion_recomendacion sa_titulacion_comentarios
##  Min.   :1.000            Min.   : 50                 Min.   :-1.000000        
##  1st Qu.:4.000            1st Qu.:100                 1st Qu.: 0.000000        
##  Median :4.000            Median :100                 Median : 0.000000        
##  Mean   :4.018            Mean   :100                 Mean   : 0.004704        
##  3rd Qu.:4.000            3rd Qu.:100                 3rd Qu.: 0.000000        
##  Max.   :5.000            Max.   :100                 Max.   : 1.000000        
##       il_R         il_participacion  il_motivo_estudios
##  Min.   :0.00000   Min.   :  0.000   Min.   :0.00000   
##  1st Qu.:0.00000   1st Qu.:  0.000   1st Qu.:0.00000   
##  Median :0.00000   Median :  0.000   Median :0.00000   
##  Mean   :0.07261   Mean   :  7.261   Mean   :0.04786   
##  3rd Qu.:0.00000   3rd Qu.:  0.000   3rd Qu.:0.00000   
##  Max.   :1.00000   Max.   :100.000   Max.   :1.00000   
##  il_consecuencia_estudios il_trabajo_actual
##  Min.   :0.00000          Min.   :0.00000  
##  1st Qu.:0.00000          1st Qu.:0.00000  
##  Median :0.00000          Median :0.00000  
##  Mean   :0.04032          Mean   :0.06201  
##  3rd Qu.:0.00000          3rd Qu.:0.00000  
##  Max.   :1.00000          Max.   :1.00000  
##  il_trabajo_actual_relacionado_estudios il_comentarios       dias_laborable  
##  Min.   :0.00000                        Min.   :-1.0000000   Min.   :  0.00  
##  1st Qu.:0.00000                        1st Qu.: 0.0000000   1st Qu.: 54.09  
##  Median :0.00000                        Median : 0.0000000   Median : 61.22  
##  Mean   :0.04204                        Mean   : 0.0004307   Mean   : 60.96  
##  3rd Qu.:0.00000                        3rd Qu.: 0.0000000   3rd Qu.: 67.69  
##  Max.   :1.00000                        Max.   : 1.0000000   Max.   :100.00  
##   dias_festivo    horario_mañana   horario_tarde    horario_noche   
##  Min.   :  0.00   Min.   :  0.00   Min.   :  0.00   Min.   :  0.00  
##  1st Qu.: 32.31   1st Qu.: 17.50   1st Qu.: 45.42   1st Qu.: 10.84  
##  Median : 38.78   Median : 25.30   Median : 52.18   Median : 18.27  
##  Mean   : 39.04   Mean   : 26.46   Mean   : 51.90   Mean   : 21.23  
##  3rd Qu.: 45.91   3rd Qu.: 33.62   3rd Qu.: 58.74   3rd Qu.: 27.94  
##  Max.   :100.00   Max.   :100.00   Max.   :100.00   Max.   :100.00  
##  cen_codnum_11416 cen_codnum_11417 cen_codnum_11418  cen_codnum_11419
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.00000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.0000  
##  Median :0.0000   Median :0.0000   Median :0.00000   Median :0.0000  
##  Mean   :0.2048   Mean   :0.3938   Mean   :0.07081   Mean   :0.2663  
##  3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:0.00000   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.00000   Max.   :1.0000  
##  cen_codnum_11420  any_anyaca_acceso_1965-80 any_anyaca_acceso_1981-95
##  Min.   :0.00000   Min.   :0.000000          Min.   :0.00000          
##  1st Qu.:0.00000   1st Qu.:0.000000          1st Qu.:0.00000          
##  Median :0.00000   Median :0.000000          Median :0.00000          
##  Mean   :0.06425   Mean   :0.005609          Mean   :0.07814          
##  3rd Qu.:0.00000   3rd Qu.:0.000000          3rd Qu.:0.00000          
##  Max.   :1.00000   Max.   :1.000000          Max.   :1.00000          
##  any_anyaca_acceso_1996-2010 any_anyaca_acceso_2011-25
##  Min.   :0.0000              Min.   :0.0000           
##  1st Qu.:0.0000              1st Qu.:0.0000           
##  Median :0.0000              Median :0.0000           
##  Mean   :0.4209              Mean   :0.4953           
##  3rd Qu.:1.0000              3rd Qu.:1.0000           
##  Max.   :1.0000              Max.   :1.0000           
##  any_anyaca_inicio_2008-13 any_anyaca_inicio_2014-19 any_anyaca_inicio_2020-25
##  Min.   :0.0000            Min.   :0.0000            Min.   :0.00000          
##  1st Qu.:0.0000            1st Qu.:0.0000            1st Qu.:0.00000          
##  Median :0.0000            Median :1.0000            Median :0.00000          
##  Mean   :0.3468            Mean   :0.5567            Mean   :0.09654          
##  3rd Qu.:1.0000            3rd Qu.:1.0000            3rd Qu.:0.00000          
##  Max.   :1.0000            Max.   :1.0000            Max.   :1.00000

Esta fuente de datos, a su vez, puede dividirse en:

  • Estudiantes que han egresado.

  • Estudiantes que no han egresado. Esta, a su vez, puede subdividirse en:

  • Estudiantes que abandonan los estudios.

  • Estudiantes en progreso.

2.3.4.2 Escalado de las variables.

Para poder aplicar las técnicas correspondientes, se normaliza el juego de datos de forma que estén centrados y escalados.

Como se ha visto anteriormente, hay distintas escalas en las variables numéricas a utilizar. Para que el análisis sea fiable y no esté influida por el “mayor peso” que aportan las variables en escala mayor se procede al escalado de las variables de modo que todas tengan media 0 y desviación estándar 1.

# se normaliza el juego de datos
data_dummy_esc = as.data.frame(scale(data_dummy, # variables numéricas a normalizar, todas
                                     center = TRUE,
                                     scale = TRUE))
2.3.4.2.1 Datos del estudiantado titulado.

Se obtienen dos juegos de datos con los registros del estudiantado titulado (uno escalado y otro no). La estructura es idéntica a la del juego de datos anterior.

# se filtran los datos de titulados
rto_fin = data_dummy %>%
  filter(titulado > 0)

# datos escalados
rto_fin_esc = data_dummy_esc %>%
  filter(titulado > min(unique(titulado)))

# dimensiones
print(paste0("Las dimensiones del juego de datos con los registros del estudiantado titulado son: ", 
             dim(rto_fin)[1], " registros y ",
             dim(rto_fin)[2], " variables."))
## [1] "Las dimensiones del juego de datos con los registros del estudiantado titulado son: 22708 registros y 68 variables."
2.3.4.2.2 Datos del estudiantado no titulado.

Se obtienen dos juegos de datos con los registros del estudiantado no titulado (uno escalado y otro no). La estructura es idéntica a la del juego de datos anterior.

# se filtran los datos de no titulados
rto_no_fin = data_dummy %>%
  filter(titulado == 0)

# datos escalados
rto_no_fin_esc = data_dummy_esc %>%
  filter(titulado == min(unique(titulado)))

# dimensiones
print(paste0("Las dimensiones del juego de datos con los registros del estudiantado NO titulado son: ", 
             dim(rto_no_fin)[1], " registros y ",
             dim(rto_no_fin)[2], " variables."))
## [1] "Las dimensiones del juego de datos con los registros del estudiantado NO titulado son: 16156 registros y 68 variables."
2.3.4.2.2.1 Datos del estudiantado que abandona.

Se obtienen dos juegos de datos con los registros del estudiantado que abandona (uno escalado y otro no). La estructura es idéntica a la del juego de datos anterior.

# se filtran los datos de abandonos
rto_abandono = rto_no_fin %>%
  filter(tasa_abandono == 1)

# datos escalados
rto_abandono_esc = data_dummy_esc %>%
  filter(tasa_abandono == max(unique(tasa_abandono)),
         titulado == min(unique(titulado)))


# dimensiones
print(paste0("Las dimensiones del juego de datos con los registros del estudiantado que abandona o traslada expediente son: ", 
             dim(rto_abandono)[1], " registros y ",
             dim(rto_abandono)[2], " variables."))
## [1] "Las dimensiones del juego de datos con los registros del estudiantado que abandona o traslada expediente son: 8167 registros y 68 variables."
2.3.4.2.2.2 Datos del estudiantado que titula o abandona. Este juego de datos se empleará para resolver los objetivos específicos 1 y 2, y servirá de ayuda en el 3.

Se obtienen dos juegos de datos con los registros del estudiantado que titula o abandona (uno escalado y otro no). La estructura es idéntica a la del juego de datos anterior.

# se obtiene juego de datos de titulados y abandono (fusión)
rto_fin_abandono = rbind(rto_fin,
                         rto_abandono)

# se obtiene sin variables dummy
rto_fin_abandono_esc = rbind(rto_fin_esc ,
                             rto_abandono_esc)

# dimensiones
print(paste0("Las dimensiones del juego de datos con los registros del estudiantado que titula o abandona son: ", 
             dim(rto_fin_abandono)[1], " registros y ",
             dim(rto_fin_abandono)[2], " variables."))
## [1] "Las dimensiones del juego de datos con los registros del estudiantado que titula o abandona son: 30875 registros y 68 variables."
2.3.4.2.2.3 Datos del estudiantado en progreso.

Se obtienen dos juegos de datos con los registros del estudiantado en progreso (uno escalado y otro no). La estructura es idéntica a la del juego de datos anterior. Este juego de datos se empleará para resolver el objetivo específico 3.

# se filtran los datos en progreso
rto_progreso = rto_no_fin %>%
  filter(tasa_abandono == 0)

# datos escalados
rto_progreso_esc = data_dummy_esc %>%
  filter(titulado == min(unique(titulado)),
         tasa_abandono == min(unique(tasa_abandono)))

# dimensiones
print(paste0("Las dimensiones del juego de datos con los registros del estudiantado en progreso son: ", 
             dim(rto_progreso)[1], " registros y ",
             dim(rto_progreso)[2], " variables."))
## [1] "Las dimensiones del juego de datos con los registros del estudiantado en progreso son: 7989 registros y 68 variables."

2.3.5 Correlaciones entre variables.

Se calcula el coeficiente de correlación entre las variables numéricas para determinar si es estadísticamente significativo (p-value) haciendo uso de la función cor del paquete stats, aplicado use=“pairwise.complete.obs” para omitir los valores ausentes en relaciones dos a dos.

Se representa gráficamente a partir de la función chart.Correlation del paquete PerformanceAnalytics.

# Se calcula el coeficiente de correlación entre las variables numéricas y dummy para determinar si es estadísticamente significativo (p-value). 
cor_data_dummy = round(cor(data_dummy_esc,
                           use="pairwise.complete.obs"), #se omiten los valores ausentes
                       digits=2)

#S e convierte a df
df_cor_data_dummy = data.frame(cor_data_dummy)

# Se elimina la propia correlación en la diagonal asignando valor 0
diag(df_cor_data_dummy) = 0

# Se representa gráficamente (no se visualiza correctamente)
chart.Correlation(df_cor_data_dummy,
                  histogram = TRUE,
                  method = "pearson")

Como el gráfico no se interpreta bien, se muestra la matriz de correlaciones:

# Se muestra df
tab_corr(df_cor_data_dummy,
         triangle = "lower")
  ste_codalf sexo nacionalidad titulado tasa_eficiencia t_exito t_evaluacion t_rec t_sup_req edad_inicio acceso complementos tasa_abandono traslado_expediente n_nodos_fin_titulacion duracion_media_estudios nota_media sa_asig_R sa_asig_participacion sa_asig_organizacion sa_asig_manual sa_asig_materiales sa_asig_actividades sa_asig_docente sa_asig_aprendiendo sa_asig_comentarios sa_curso_R sa_curso_participacion sa_curso_nivel_academico sa_curso_implicacion sa_curso_aprovechamiento_recursos sa_curso_titulacion sa_curso_recomendacion sa_curso_comentarios sa_titulacion_R sa_titulacion_participacion sa_titulacion_nivel_academico sa_titulacion_implicacion sa_titulacion_aprovechamiento_recursos sa_titulacion_mejora_profesional sa_titulacion_obtener_trabajo sa_titulacion_titulacion sa_titulacion_recomendacion sa_titulacion_comentarios il_R il_participacion il_motivo_estudios il_consecuencia_estudios il_trabajo_actual il_trabajo_actual_relacionado_estudios il_comentarios dias_laborable dias_festivo horario_mañana horario_tarde horario_noche cen_codnum_11416 cen_codnum_11417 cen_codnum_11418 cen_codnum_11419 cen_codnum_11420 any_anyaca_acceso_1965.80 any_anyaca_acceso_1981.95 any_anyaca_acceso_1996.2010 any_anyaca_acceso_2011.25 any_anyaca_inicio_2008.13 any_anyaca_inicio_2014.19 any_anyaca_inicio_2020.25
ste_codalf                                                                                                                                        
sexo 0.491***                                                                                                                                      
nacionalidad -0.188 0.003                                                                                                                                    
titulado 0.698*** 0.441*** -0.016                                                                                                                                  
tasa_eficiencia 0.698*** 0.528*** -0.001 0.794***                                                                                                                                
t_exito 0.684*** 0.525*** -0.007 0.814*** 0.744***                                                                                                                              
t_evaluacion 0.692*** 0.547*** 0.022 0.796*** 0.734*** 0.777***                                                                                                                            
t_rec -0.036 -0.025 0.244* 0.215 0.244* 0.260* 0.249*                                                                                                                          
t_sup_req 0.673*** 0.494*** -0.017 0.792*** 0.795*** 0.804*** 0.802*** 0.143                                                                                                                        
edad_inicio -0.504*** -0.301* -0.051 -0.374** -0.417*** -0.417*** -0.420*** 0.250* -0.404***                                                                                                                      
acceso 0.704*** 0.479*** -0.218 0.731*** 0.713*** 0.696*** 0.713*** -0.172 0.723*** -0.528***                                                                                                                    
complementos 0.648*** 0.364** -0.467*** 0.449*** 0.430*** 0.413*** 0.436*** -0.385** 0.390** -0.327** 0.666***                                                                                                                  
tasa_abandono -0.704*** -0.566*** -0.019 -0.762*** -0.821*** -0.844*** -0.834*** -0.205 -0.801*** 0.484*** -0.742*** -0.478***                                                                                                                
traslado_expediente -0.751*** -0.441*** 0.197 -0.745*** -0.729*** -0.722*** -0.748*** 0.050 -0.739*** 0.450*** -0.747*** -0.689*** 0.700***                                                                                                              
n_nodos_fin_titulacion 0.699*** 0.435*** -0.001 0.730*** 0.803*** 0.826*** 0.801*** 0.205 0.796*** -0.370** 0.717*** 0.429*** -0.778*** -0.739***                                                                                                            
duracion_media_estudios -0.346** -0.211 0.268* -0.013 0.024 -0.010 0.012 0.717*** -0.098 0.349** -0.356** -0.509*** 0.077 0.334** 0.012                                                                                                          
nota_media 0.723*** 0.352** -0.118 0.752*** 0.675*** 0.700*** 0.718*** 0.119 0.745*** -0.247* 0.719*** 0.441*** -0.651*** -0.677*** 0.755*** -0.110                                                                                                        
sa_asig_R 0.009 0.274* 0.105 0.200 0.269* 0.265* 0.280* 0.410*** 0.218 0.185 0.025 -0.077 -0.282* -0.115 0.222 0.386** 0.171                                                                                                      
sa_asig_participacion 0.016 0.250* 0.119 0.227 0.285* 0.280* 0.298* 0.401*** 0.240* 0.135 0.041 -0.061 -0.308* -0.139 0.243* 0.397*** 0.169 0.477***                                                                                                    
sa_asig_organizacion -0.076 -0.115 -0.185 -0.185 -0.207 -0.201 -0.212 -0.166 -0.195 0.093 -0.111 0.089 0.258* 0.135 -0.199 -0.068 -0.159 -0.270* -0.304*                                                                                                  
sa_asig_manual -0.055 -0.092 -0.200 -0.153 -0.177 -0.166 -0.174 -0.135 -0.166 0.097 -0.090 0.119 0.227 0.109 -0.170 -0.045 -0.110 -0.220 -0.289* 0.772***                                                                                                
sa_asig_materiales -0.068 -0.113 -0.205 -0.179 -0.204 -0.199 -0.204 -0.165 -0.192 0.092 -0.105 0.103 0.252* 0.126 -0.189 -0.077 -0.139 -0.276* -0.322** 0.709*** 0.762***                                                                                              
sa_asig_actividades -0.080 -0.128 -0.193 -0.188 -0.212 -0.206 -0.213 -0.144 -0.197 0.101 -0.111 0.080 0.260* 0.143 -0.197 -0.063 -0.160 -0.267* -0.305* 0.760*** 0.729*** 0.751***                                                                                            
sa_asig_docente -0.082 -0.117 -0.199 -0.202 -0.227 -0.221 -0.228 -0.172 -0.210 0.080 -0.118 0.080 0.270* 0.139 -0.218 -0.075 -0.173 -0.295* -0.315** 0.762*** 0.774*** 0.773*** 0.708***                                                                                          
sa_asig_aprendiendo 0.089 -0.131 -0.274* -0.164 -0.232 -0.237 -0.250* -0.501*** -0.179 -0.130 0.074 0.245* 0.270* 0.057 -0.186 -0.405*** -0.065 -0.652*** -0.671*** 0.659*** 0.644*** 0.667*** 0.666*** 0.685***                                                                                        
sa_asig_comentarios -0.121 0.151 0.089 0.115 0.200 0.199 0.216 0.532*** 0.141 0.276* -0.110 -0.141 -0.205 -0.033 0.144 0.508*** 0.036 0.830*** 0.696*** -0.228 -0.196 -0.246* -0.240* -0.233 -0.719***                                                                                      
sa_curso_R 0.047 0.300* 0.078 0.175 0.265* 0.264* 0.287* 0.299* 0.214 0.078 0.064 0.020 -0.321** -0.175 0.193 0.334** 0.101 0.676*** 0.687*** -0.303* -0.257* -0.317** -0.307* -0.318** -0.660*** 0.721***                                                                                    
sa_curso_participacion 0.025 0.276* 0.127 0.185 0.269* 0.263* 0.292* 0.340** 0.218 0.063 0.049 -0.021 -0.312** -0.168 0.203 0.300* 0.065 0.681*** 0.683*** -0.308* -0.271* -0.317** -0.313** -0.335** -0.660*** 0.722*** 0.490***                                                                                  
sa_curso_nivel_academico 0.034 0.174 -0.006 0.048 0.047 0.040 0.047 0.064 0.026 0.067 0.010 0.061 0.011 -0.045 0.048 0.061 0.127 0.099 0.071 0.375** 0.408*** 0.382** 0.375** 0.372** 0.222 0.103 -0.015 -0.052                                                                                
sa_curso_implicacion 0.136 0.009 -0.093 0.045 -0.025 -0.028 -0.041 -0.171 0.011 -0.065 0.129 0.080 0.068 -0.035 0.035 -0.201 0.209 -0.320** -0.340** 0.378** 0.378** 0.391*** 0.376** 0.379** 0.538*** -0.345** -0.468*** -0.391*** 0.486***                                                                              
sa_curso_aprovechamiento_recursos -0.039 0.069 -0.011 -0.029 -0.040 -0.030 -0.035 0.074 -0.047 0.100 -0.057 0.008 0.100 0.037 -0.029 0.103 0.057 0.092 0.047 0.441*** 0.445*** 0.435*** 0.435*** 0.433*** 0.233 0.107 -0.035 -0.062 0.608*** 0.341**                                                                            
sa_curso_titulacion -0.109 -0.154 -0.117 -0.164 -0.213 -0.211 -0.219 -0.051 -0.186 0.127 -0.143 -0.028 0.290* 0.182 -0.173 -0.001 -0.098 -0.254* -0.305* 0.703*** 0.699*** 0.699*** 0.702*** 0.701*** 0.592*** -0.183 -0.359** -0.356** 0.546*** 0.674*** 0.511***                                                                          
sa_curso_recomendacion 0.221 -0.115 -0.244* -0.048 -0.130 -0.153 -0.157 -0.536*** -0.072 -0.199 0.199 0.286* 0.162 -0.042 -0.076 -0.516*** 0.139 -0.670*** -0.697*** 0.441*** 0.425*** 0.465*** 0.454*** 0.472*** 0.820*** -0.764*** -0.724*** -0.717*** 0.168 0.635*** 0.188 0.453***                                                                        
sa_curso_comentarios -0.016 0.276* 0.112 0.164 0.258* 0.251* 0.277* 0.411*** 0.191 0.139 0.001 -0.037 -0.299* -0.133 0.177 0.379** 0.026 0.738*** 0.759*** -0.335** -0.294* -0.347** -0.344** -0.359** -0.753*** 0.769*** 0.824*** 0.769*** -0.023 -0.536*** -0.067 -0.379** -0.874***                                                                      
sa_titulacion_R 0.264* 0.139 0.089 0.466*** 0.396*** 0.377** 0.397*** 0.309* 0.428*** -0.034 0.264* 0.111 -0.412*** -0.349** 0.484*** 0.220 0.376** 0.475*** 0.475*** -0.211 -0.172 -0.211 -0.208 -0.227 -0.423*** 0.435*** 0.433*** 0.454*** 0.066 -0.164 0.017 -0.184 -0.341** 0.453***                                                                    
sa_titulacion_participacion 0.265* 0.139 0.090 0.469*** 0.397*** 0.379** 0.398*** 0.310* 0.430*** -0.035 0.265* 0.111 -0.414*** -0.350** 0.480*** 0.220 0.377** 0.474*** 0.475*** -0.211 -0.172 -0.211 -0.208 -0.227 -0.423*** 0.434*** 0.433*** 0.454*** 0.066 -0.163 0.017 -0.184 -0.341** 0.452*** 0.585***                                                                  
sa_titulacion_nivel_academico -0.019 0.018 -0.017 0.022 0.003 -0.015 0.003 0.109 0.013 0.091 -0.042 0.047 0.034 -0.006 0.028 0.168 0.025 0.166 0.142 0.127 0.145 0.120 0.136 0.123 -0.020 0.197 0.113 0.118 0.256* 0.211 0.397*** 0.332** -0.041 0.106 0.174 0.173                                                                
sa_titulacion_implicacion -0.223 -0.129 -0.155 -0.399*** -0.345** -0.319** -0.344** -0.237 -0.368** 0.097 -0.215 -0.083 0.390** 0.309* -0.407*** -0.162 -0.263* -0.424*** -0.450*** 0.289* 0.268* 0.294* 0.295* 0.308* 0.444*** -0.370** -0.451*** -0.457*** 0.136 0.271* 0.191 0.383** 0.376** -0.481*** -0.712*** -0.712*** 0.074                                                              
sa_titulacion_aprovechamiento_recursos -0.000 0.026 0.001 0.072 0.042 0.029 0.042 0.178 0.046 0.101 -0.016 0.029 -0.008 -0.022 0.066 0.187 0.069 0.224 0.224 0.078 0.106 0.083 0.076 0.069 -0.088 0.248* 0.177 0.173 0.386** 0.165 0.272* 0.287* -0.098 0.158 0.244* 0.244* 0.543*** -0.123                                                            
sa_titulacion_mejora_profesional -0.168 -0.125 -0.096 -0.309* -0.284* -0.276* -0.280* -0.183 -0.296* 0.059 -0.187 0.006 0.317** 0.238 -0.314** -0.091 -0.244* -0.289* -0.298* 0.274* 0.251* 0.274* 0.263* 0.272* 0.350** -0.258* -0.278* -0.279* 0.140 0.190 0.183 0.376** 0.262* -0.318** -0.385** -0.385** 0.440*** 0.608*** 0.338**                                                          
sa_titulacion_obtener_trabajo 0.012 -0.028 -0.066 -0.044 -0.079 -0.079 -0.071 -0.067 -0.066 0.013 -0.007 0.086 0.102 0.035 -0.054 -0.025 -0.044 -0.076 -0.089 0.131 0.148 0.134 0.145 0.153 0.146 -0.062 -0.071 -0.066 0.180 0.143 0.182 0.264* 0.134 -0.095 -0.017 -0.018 0.555*** 0.227 0.543*** 0.330**                                                        
sa_titulacion_titulacion -0.029 -0.097 -0.068 0.004 -0.049 -0.049 -0.056 0.105 -0.023 0.149 -0.057 0.037 0.108 0.041 0.004 0.161 0.006 0.028 -0.001 0.331** 0.346** 0.333** 0.322** 0.322** 0.178 0.076 -0.045 -0.039 0.366** 0.261* 0.414*** 0.410*** 0.130 -0.057 0.108 0.107 0.628*** 0.088 0.575*** 0.288* 0.623***                                                      
sa_titulacion_recomendacion -0.184 -0.066 -0.124 -0.293* -0.234 -0.201 -0.224 -0.182 -0.228 0.093 -0.172 -0.060 0.269* 0.237 -0.235 -0.121 -0.214 -0.271* -0.282* 0.126 0.109 0.134 0.128 0.141 0.208 -0.233 -0.239* -0.245* -0.187 0.035 -0.051 0.180 0.180 -0.261* -0.459*** -0.460*** 0.173 0.547*** 0.036 0.583*** 0.486*** 0.267*                                                    
sa_titulacion_comentarios 0.209 0.095 0.085 0.427*** 0.341** 0.311** 0.335** 0.333** 0.371** 0.028 0.194 0.085 -0.354** -0.295* 0.436*** 0.246* 0.322** 0.504*** 0.522*** -0.221 -0.180 -0.233 -0.223 -0.246* -0.464*** 0.464*** 0.469*** 0.480*** 0.058 -0.200 -0.002 -0.195 -0.366** 0.476*** 0.822*** 0.822*** 0.211 -0.820*** 0.323** -0.473*** 0.012 0.217 -0.515***                                                  
il_R 0.214 0.075 0.147 0.378** 0.293* 0.270* 0.292* 0.211 0.331** -0.077 0.208 0.085 -0.312** -0.269* 0.387** 0.150 0.278* 0.351** 0.363** -0.210 -0.182 -0.210 -0.206 -0.217 -0.339** 0.297* 0.353** 0.370** 0.026 -0.148 -0.031 -0.183 -0.263* 0.363** 0.726*** 0.726*** 0.167 -0.736*** 0.253* -0.309* 0.124 0.150 -0.350** 0.775***                                                
il_participacion 0.214 0.075 0.147 0.378** 0.293* 0.270* 0.292* 0.211 0.331** -0.077 0.208 0.085 -0.312** -0.269* 0.387** 0.150 0.278* 0.351** 0.363** -0.210 -0.182 -0.210 -0.206 -0.217 -0.339** 0.297* 0.353** 0.370** 0.026 -0.148 -0.031 -0.183 -0.263* 0.363** 0.726*** 0.726*** 0.167 -0.736*** 0.253* -0.309* 0.124 0.150 -0.350** 0.775*** 0.739***                                              
il_motivo_estudios 0.221 0.097 0.148 0.385** 0.301* 0.275* 0.297* 0.203 0.334** -0.090 0.211 0.085 -0.322** -0.275* 0.389** 0.148 0.276* 0.367** 0.379** -0.215 -0.188 -0.215 -0.212 -0.222 -0.354** 0.306* 0.372** 0.386** 0.029 -0.161 -0.028 -0.195 -0.277* 0.384** 0.747*** 0.746*** 0.176 -0.749*** 0.257* -0.320** 0.112 0.173 -0.352** 0.791*** 0.797*** 0.797***                                            
il_consecuencia_estudios 0.219 0.071 0.144 0.362** 0.271* 0.247* 0.266* 0.176 0.312** -0.092 0.204 0.093 -0.285* -0.261* 0.368** 0.128 0.263* 0.317** 0.315** -0.189 -0.165 -0.187 -0.184 -0.197 -0.304* 0.256* 0.328** 0.338** 0.028 -0.126 -0.025 -0.156 -0.215 0.313** 0.714*** 0.713*** 0.216 -0.714*** 0.304* -0.284* 0.123 0.213 -0.328** 0.751*** 0.811*** 0.811*** 0.830***                                          
il_trabajo_actual 0.212 0.082 0.151 0.371** 0.281* 0.260* 0.279* 0.203 0.319** -0.079 0.200 0.076 -0.299* -0.257* 0.379** 0.149 0.269* 0.344** 0.346** -0.204 -0.177 -0.203 -0.199 -0.215 -0.328** 0.288* 0.338** 0.360** 0.023 -0.142 -0.024 -0.181 -0.247* 0.353** 0.722*** 0.721*** 0.174 -0.735*** 0.266* -0.302* 0.130 0.169 -0.433*** 0.775*** 0.768*** 0.768*** 0.823*** 0.803***                                        
il_trabajo_actual_relacionado_estudios 0.208 0.058 0.150 0.366** 0.274* 0.244* 0.267* 0.175 0.315** -0.079 0.196 0.084 -0.284* -0.258* 0.373** 0.143 0.266* 0.321** 0.328** -0.190 -0.165 -0.188 -0.185 -0.200 -0.305* 0.266* 0.326** 0.344** 0.024 -0.122 -0.020 -0.162 -0.224 0.328** 0.720*** 0.720*** 0.201 -0.734*** 0.305* -0.285* 0.146 0.194 -0.358** 0.768*** 0.808*** 0.808*** 0.864*** 0.802*** 0.779***                                      
il_comentarios -0.075 -0.023 -0.040 0.142 0.123 0.115 0.095 0.393*** 0.110 0.301* -0.060 -0.097 -0.088 -0.026 0.163 0.393*** 0.185 0.373** 0.425*** -0.128 -0.070 -0.100 -0.094 -0.123 -0.377** 0.451*** 0.328** 0.348** 0.008 -0.145 0.016 -0.163 -0.359** 0.393*** 0.447*** 0.447*** 0.005 -0.470*** 0.098 -0.440*** -0.210 -0.064 -0.520*** 0.403*** 0.399*** 0.399*** 0.385** 0.379** 0.409*** 0.423***                                    
dias_laborable -0.149 -0.082 0.202 -0.103 -0.125 -0.137 -0.139 -0.012 -0.138 0.133 -0.139 -0.270* 0.139 0.179 -0.099 -0.013 0.073 0.059 0.038 0.018 0.010 0.019 0.023 0.019 -0.012 -0.009 -0.025 -0.040 0.074 0.127 0.070 0.051 0.042 -0.055 -0.020 -0.020 0.036 0.062 0.049 0.012 0.008 0.043 -0.026 -0.000 -0.006 -0.006 -0.014 -0.010 -0.004 -0.004 0.104                                  
dias_festivo 0.188 0.093 -0.238 0.183 0.207 0.218 0.218 0.054 0.220 -0.109 0.187 0.287* -0.242* -0.246* 0.181 0.014 0.020 0.034 0.051 0.051 0.068 0.050 0.046 0.042 -0.007 0.092 0.091 0.106 0.058 -0.063 0.063 0.044 -0.068 0.119 0.124 0.124 0.103 -0.120 0.103 0.010 0.081 0.108 -0.033 0.112 0.104 0.104 0.111 0.109 0.102 0.104 -0.054 -0.149                                
horario_mañana 0.003 0.146 0.442*** 0.132 0.161 0.154 0.159 0.145 0.122 -0.084 0.025 -0.302* -0.177 -0.038 0.140 0.092 0.148 0.206 0.212 -0.149 -0.154 -0.157 -0.151 -0.156 -0.231 0.122 0.181 0.188 0.072 -0.012 0.031 -0.104 -0.190 0.164 0.140 0.141 0.043 -0.139 0.078 -0.101 -0.018 -0.034 -0.102 0.125 0.151 0.151 0.160 0.147 0.145 0.144 0.056 0.288* -0.314**                              
horario_tarde 0.045 0.017 0.212 0.082 0.086 0.084 0.086 -0.003 0.081 -0.171 0.035 -0.090 -0.110 -0.044 0.075 -0.014 0.040 0.030 0.035 0.011 0.014 0.006 0.012 0.006 -0.026 -0.018 0.042 0.049 0.087 0.034 0.070 0.046 -0.024 0.019 0.076 0.076 0.068 -0.084 0.088 -0.003 0.067 0.058 -0.051 0.051 0.110 0.110 0.121 0.124 0.110 0.118 -0.058 0.003 -0.047 0.583***                            
horario_noche 0.067 -0.085 -0.557*** 0.018 -0.020 -0.017 -0.018 -0.019 0.022 0.202 0.071 0.370** 0.018 -0.086 0.008 -0.064 0.016 -0.031 -0.045 0.228 0.244* 0.224 0.230 0.211 0.163 0.051 -0.069 -0.073 0.092 0.089 0.157 0.222 0.115 -0.038 0.034 0.034 0.137 0.058 0.141 0.106 0.124 0.231 0.010 0.059 -0.018 -0.018 -0.025 -0.012 -0.013 -0.005 0.139 -0.321** 0.291* -0.038 0.245*                          
cen_codnum_11416 0.194 -0.066 -0.299* 0.227 0.162 0.149 0.149 -0.035 0.198 0.011 0.224 0.249* -0.146 -0.223 0.227 -0.133 0.303* -0.082 -0.086 0.164 0.166 0.179 0.162 0.150 0.199 -0.098 -0.140 -0.157 0.156 0.243* 0.159 0.194 0.236 -0.172 0.087 0.087 0.103 0.004 0.097 0.024 0.088 0.187 0.026 0.073 0.072 0.072 0.061 0.081 0.073 0.082 0.103 -0.089 0.053 -0.223 -0.064 0.189                        
cen_codnum_11417 0.358** -0.038 -0.014 0.296* 0.255* 0.255* 0.242* -0.236 0.278* -0.262* 0.357** 0.254* -0.261* -0.308* 0.280* -0.246* 0.294* -0.223 -0.217 0.202 0.207 0.220 0.209 0.207 0.312** -0.291* -0.215 -0.232 0.139 0.274* 0.125 0.220 0.344** -0.289* 0.017 0.018 0.094 0.041 0.082 0.091 0.143 0.175 -0.001 -0.037 0.045 0.045 0.043 0.070 0.048 0.059 -0.182 -0.064 0.039 -0.012 0.071 -0.068 0.503***                      
cen_codnum_11418 -0.541*** -0.376** -0.042 -0.500*** -0.512*** -0.518*** -0.501*** 0.146 -0.519*** 0.508*** -0.564*** -0.416*** 0.550*** 0.589*** -0.491*** 0.253* -0.381** 0.112 0.060 0.254* 0.261* 0.264* 0.265* 0.259* 0.006 0.207 -0.014 -0.013 0.167 0.057 0.267* 0.291* -0.078 0.011 -0.077 -0.078 0.200 0.133 0.190 0.147 0.096 0.274* 0.093 0.001 -0.099 -0.099 -0.101 -0.090 -0.086 -0.094 0.158 0.142 -0.213 -0.156 -0.123 0.075 0.375** 0.125                    
cen_codnum_11419 0.113 0.438*** 0.059 0.204 0.291* 0.293* 0.300* 0.238 0.241* -0.075 0.114 -0.007 -0.353** -0.215 0.204 0.092 0.156 0.463*** 0.478*** -0.271* -0.240* -0.276* -0.275* -0.290* -0.462*** 0.444*** 0.513*** 0.501*** 0.015 -0.253* 0.003 -0.297* -0.465*** 0.528*** 0.275* 0.275* 0.061 -0.292* 0.102 -0.197 -0.051 -0.082 -0.082 0.285* 0.226 0.226 0.243* 0.211 0.217 0.209 0.185 -0.047 0.026 0.189 -0.069 -0.144 0.290* 0.119 0.226                  
cen_codnum_11420 -0.763*** -0.465*** 0.156 -0.628*** -0.608*** -0.616*** -0.613*** 0.250* -0.631*** 0.556*** -0.768*** -0.593*** 0.615*** 0.695*** -0.604*** 0.445*** -0.652*** 0.132 0.111 0.047 0.043 0.045 0.050 0.054 -0.219 0.272* 0.066 0.095 0.033 -0.166 0.092 0.134 -0.316** 0.150 -0.076 -0.077 0.180 0.068 0.188 0.151 0.085 0.203 0.090 0.019 -0.034 -0.034 -0.039 -0.033 -0.032 -0.032 0.202 0.069 -0.164 -0.098 -0.115 -0.028 0.116 -0.141 0.791*** 0.101                
any_anyaca_acceso_1965.80 -0.519*** -0.526*** 0.105 -0.464*** -0.493*** -0.484*** -0.496*** 0.141 -0.493*** 0.330** -0.522*** -0.489*** 0.512*** 0.499*** -0.444*** 0.276* -0.325** 0.001 -0.023 0.112 0.109 0.113 0.116 0.112 -0.001 0.091 -0.111 -0.100 0.011 0.031 0.084 0.193 -0.045 -0.064 -0.128 -0.129 0.086 0.160 0.068 0.128 0.049 0.146 0.020 -0.047 -0.127 -0.127 -0.146 -0.147 -0.117 -0.115 0.134 0.198 -0.214 -0.030 -0.080 0.036 -0.077 -0.179 0.464*** -0.186 0.552***              
any_anyaca_acceso_1981.95 -0.451*** -0.514*** 0.040 -0.360** -0.395*** -0.396*** -0.403*** 0.179 -0.385** 0.409*** -0.444*** -0.412*** 0.429*** 0.406*** -0.344** 0.298* -0.229 0.050 0.027 0.151 0.152 0.147 0.158 0.153 -0.014 0.148 -0.073 -0.059 0.071 0.043 0.143 0.220 -0.058 -0.022 -0.063 -0.064 0.106 0.123 0.094 0.105 0.033 0.185 -0.008 0.008 -0.077 -0.077 -0.087 -0.085 -0.068 -0.068 0.202 0.139 -0.143 -0.049 -0.128 0.101 -0.039 -0.136 0.411*** -0.182 0.471*** 0.939***            
any_anyaca_acceso_1996.2010 -0.106 -0.238 -0.202 0.030 -0.052 -0.047 -0.076 0.226 -0.011 0.345** -0.086 -0.118 0.119 0.117 0.033 0.160 0.187 -0.076 -0.097 0.111 0.118 0.123 0.125 0.108 0.095 -0.045 -0.216 -0.221 0.072 0.198 0.091 0.191 0.131 -0.193 -0.022 -0.021 0.038 0.129 0.038 0.036 -0.002 0.160 0.056 0.004 -0.063 -0.063 -0.090 -0.079 -0.060 -0.059 0.274* 0.109 -0.134 -0.166 -0.180 0.220 0.221 -0.067 0.150 -0.229 0.080 0.456*** 0.585***          
any_anyaca_acceso_2011.25 0.297* 0.412*** 0.107 0.204 0.293* 0.287* 0.306* -0.212 0.255* -0.409*** 0.302* 0.272* -0.383** -0.332** 0.197 -0.239* 0.045 0.157 0.177 -0.071 -0.062 -0.076 -0.087 -0.075 -0.106 0.085 0.289* 0.287* 0.068 -0.122 0.036 -0.138 -0.119 0.245* 0.165 0.164 0.086 -0.230 0.115 -0.045 0.088 -0.021 -0.014 0.134 0.198 0.198 0.224 0.212 0.193 0.194 -0.209 -0.186 0.149 0.122 0.149 -0.253* -0.213 0.080 -0.357** 0.241* -0.345** -0.387** -0.274* -0.336**        
any_anyaca_inicio_2008.13 -0.047 -0.344** -0.150 -0.007 -0.093 -0.086 -0.119 0.093 -0.045 0.315** -0.042 -0.075 0.133 0.131 -0.005 -0.008 0.186 -0.297* -0.313** 0.212 0.198 0.224 0.226 0.216 0.318** -0.278* -0.448*** -0.440*** 0.054 0.357** 0.074 0.313** 0.407*** -0.473*** -0.147 -0.146 -0.018 0.253* -0.036 0.101 0.014 0.147 0.061 -0.140 -0.162 -0.162 -0.190 -0.164 -0.155 -0.148 0.092 0.171 -0.195 -0.153 -0.123 0.170 0.241* 0.122 0.140 -0.427*** 0.012 0.243* 0.261* 0.576*** -0.622***      
any_anyaca_inicio_2014.19 0.192 0.348** 0.169 0.248* 0.309* 0.299* 0.330** 0.088 0.274* -0.316** 0.193 0.114 -0.403*** -0.294* 0.256* 0.056 0.059 0.386** 0.400*** -0.195 -0.169 -0.200 -0.200 -0.201 -0.378** 0.358** 0.491*** 0.481*** 0.062 -0.251* 0.030 -0.231 -0.420*** 0.495*** 0.379** 0.380** 0.153 -0.429*** 0.206 -0.176 0.059 0.020 -0.211 0.380** 0.375** 0.375** 0.398*** 0.372** 0.365** 0.360** 0.010 -0.237 0.237 0.130 0.098 -0.179 -0.205 -0.070 -0.248* 0.394*** -0.159 -0.310* -0.297* -0.518*** 0.546*** -0.357**    
any_anyaca_inicio_2020.25 -0.245* 0.035 -0.135 -0.361** -0.297* -0.294* -0.293* -0.342** -0.330** 0.073 -0.237 -0.043 0.375** 0.226 -0.392*** -0.127 -0.318** 0.057 0.045 0.147 0.144 0.143 0.139 0.151 0.073 0.069 0.112 0.107 0.070 -0.082 0.135 0.072 -0.062 0.123 -0.285* -0.287* 0.063 0.264* 0.041 0.232 0.096 0.012 0.222 -0.278* -0.244* -0.244* -0.238 -0.228 -0.244* -0.236 -0.103 0.059 -0.150 -0.024 -0.060 -0.056 -0.213 -0.200 0.107 0.049 0.110 0.085 0.043 -0.261* 0.090 -0.052 0.225  
Computed correlation used pearson-method with listwise-deletion.

2.3.6 Estudios PCA y SVD.

Como se ha comprobado en el apartado anterior, no es posible obtener conclusiones relevantes de la correlación entre variables según la dimensión actual, por lo que se va a explorar la relación entre variables mediante la aplicación de PCA (Análisis de Componentes Principales), un algoritmo de aprendizaje no supervisado que se centra en la variación de datos, y de SVG (Single Value Decomposition) sobre dicho juego de datos.

2.3.6.1 Estudio PCA.

El método PCA, al trabajar con varianzas, puede verse condicionado por la presencia de outliers pero ya se comprobó que no había. Además, es necesario no tener valores ausentes (que ya fue resuelto anteriormente).

¿Qué métodos se van a usar para aplicar PCA?

Hay varias opciones para realizar este estudio, de cada método se obtendrán conclusiones relevantes. A continuación se detalla cada método y sus resultados:

2.3.6.1.1 Método 1: función prcomp de la librería stats.

Mediante la función prcomp de la librería stats se escalan y centran las variables (solo para el estudio PCA, sin alterar el origen de datos). Para ello, previamente no debe haber valores ausentes (previamente se han tratado los datos). De sus resultados se concluye que el 85% de la varianza acumulada del juego de datos se obtiene en el PC33 (es decir, 35 variables).

# MÉTODO 1: library(stats)
# • prcomp() -> Forma rápida de implementar PCA sobre una matriz de datos.
# • princomp()


# Para escalar las variables, hay dos opciones, centrarlas mediante la función scale(df, center = TRUE, scale = TRUE) y utilizar primcomp o utilizar prcomp (que centra las variables solo para el estudio pca sin alterar el origen de datos), añadiendo la opcion de centrarlas. Esta es la opción que se aplica a continuación

# Se calculan los componentes principales excluyendo los valores ausentes
df_pca_imp_0 = prcomp(data_dummy_esc,# centra las variables para que tengan media cero
                      scale = FALSE) # desviación estándar sea de uno

# Se muestra el resultado
summary(df_pca_imp_0,
        loadings = T)
## Importance of components:
##                           PC1    PC2     PC3     PC4     PC5     PC6     PC7
## Standard deviation     2.7234 2.1739 2.12277 1.79657 1.72545 1.53275 1.48957
## Proportion of Variance 0.1091 0.0695 0.06627 0.04747 0.04378 0.03455 0.03263
## Cumulative Proportion  0.1091 0.1786 0.24484 0.29230 0.33608 0.37063 0.40326
##                            PC8     PC9    PC10    PC11    PC12    PC13    PC14
## Standard deviation     1.45029 1.33402 1.28452 1.25803 1.22714 1.19363 1.17299
## Proportion of Variance 0.03093 0.02617 0.02426 0.02327 0.02215 0.02095 0.02023
## Cumulative Proportion  0.43419 0.46036 0.48463 0.50790 0.53005 0.55100 0.57123
##                           PC15    PC16    PC17    PC18    PC19   PC20    PC21
## Standard deviation     1.16694 1.14529 1.14079 1.08278 1.07741 1.0398 1.02832
## Proportion of Variance 0.02003 0.01929 0.01914 0.01724 0.01707 0.0159 0.01555
## Cumulative Proportion  0.59126 0.61055 0.62969 0.64693 0.66400 0.6799 0.69545
##                           PC22    PC23    PC24    PC25    PC26    PC27    PC28
## Standard deviation     1.02297 1.00163 0.99708 0.98850 0.97127 0.95019 0.93801
## Proportion of Variance 0.01539 0.01475 0.01462 0.01437 0.01387 0.01328 0.01294
## Cumulative Proportion  0.71084 0.72559 0.74021 0.75458 0.76845 0.78173 0.79467
##                           PC29    PC30    PC31   PC32    PC33    PC34   PC35
## Standard deviation     0.91713 0.90473 0.88698 0.8767 0.86344 0.85820 0.8451
## Proportion of Variance 0.01237 0.01204 0.01157 0.0113 0.01096 0.01083 0.0105
## Cumulative Proportion  0.80704 0.81908 0.83065 0.8419 0.85292 0.86375 0.8742
##                           PC36    PC37    PC38    PC39    PC40    PC41   PC42
## Standard deviation     0.84261 0.80283 0.78925 0.77869 0.75883 0.73349 0.7187
## Proportion of Variance 0.01044 0.00948 0.00916 0.00892 0.00847 0.00791 0.0076
## Cumulative Proportion  0.88469 0.89417 0.90333 0.91225 0.92071 0.92863 0.9362
##                           PC43    PC44    PC45    PC46    PC47    PC48    PC49
## Standard deviation     0.68130 0.65327 0.62771 0.60942 0.59956 0.57679 0.55280
## Proportion of Variance 0.00683 0.00628 0.00579 0.00546 0.00529 0.00489 0.00449
## Cumulative Proportion  0.94305 0.94932 0.95512 0.96058 0.96587 0.97076 0.97525
##                           PC50    PC51    PC52    PC53    PC54   PC55    PC56
## Standard deviation     0.49419 0.46791 0.44964 0.44777 0.44315 0.4036 0.39034
## Proportion of Variance 0.00359 0.00322 0.00297 0.00295 0.00289 0.0024 0.00224
## Cumulative Proportion  0.97884 0.98206 0.98504 0.98799 0.99087 0.9933 0.99551
##                           PC57    PC58    PC59    PC60    PC61    PC62    PC63
## Standard deviation     0.29378 0.27673 0.26861 0.19898 0.16936 0.03303 0.03015
## Proportion of Variance 0.00127 0.00113 0.00106 0.00058 0.00042 0.00002 0.00001
## Cumulative Proportion  0.99678 0.99791 0.99897 0.99955 0.99997 0.99999 1.00000
##                             PC64      PC65      PC66      PC67      PC68
## Standard deviation     2.687e-06 1.209e-15 4.754e-16 2.868e-16 2.165e-16
## Proportion of Variance 0.000e+00 0.000e+00 0.000e+00 0.000e+00 0.000e+00
## Cumulative Proportion  1.000e+00 1.000e+00 1.000e+00 1.000e+00 1.000e+00

¿Qué contiene la matriz df_pca?

names(df_pca_imp_0)
## [1] "sdev"     "rotation" "center"   "scale"    "x"
  • sdev: informa sobre la varianza explicada por cada componente/variable, la proporción respecto al total y la proporción de varianza acumulada.

  • rotation: contiene el valor de los loadings ϕ para cada componente (eigenvector).

  • center: contiene la media de las variables previas a la estandarización (en la escala original).

  • scale: contiene la desviación típica de las variables previas a la estandarización (en la escala original).

  • x: almacena (en forma de matriz) el resultado de multiplicar el valor de los componentes principales (CP) y los datos de los vectores de loadings.

2.3.6.1.2 Método 2: función get_pca_var y get_pca de la librería factoextra.

Con las funciones get_pca_var y get_pca de la librería factoextra se obtienen resultados de las contribuciones de las variables.

Se muestran (ordenadas descendentemente) las contribuciones de la primera y segunda dimensión:

# MÉTODO 2: library(factoextra)

# • get_pca_var() -> Extrae la información sobre las variables.
 var = get_pca_var(df_pca_imp_0)
 # head(var$contrib) # contribución variables

# • get_pca() -> Extrae la información sobre las observaciones y variables de un análisis PCA.
 resultados_pca = get_pca(df_pca_imp_0, "var") # variables (si ind, observaciones)
 
 # se obtiene el top25 del PC1 ordenado
 print('El top35 del PC1 ordenado es:')
## [1] "El top35 del PC1 ordenado es:"
 sort(resultados_pca$contrib[, 1], decreasing = T)[1:25]
##                                   il_R                       il_participacion 
##                              6.8534923                              6.8534923 
##                              t_sup_req                               titulado 
##                              6.8380721                              6.4123034 
##                      il_trabajo_actual                        tasa_eficiencia 
##                              6.2880708                              5.9650803 
##                 n_nodos_fin_titulacion                           t_evaluacion 
##                              5.9085246                              5.2584334 
##                     il_motivo_estudios            sa_titulacion_participacion 
##                              5.0504018                              4.7325803 
##                        sa_titulacion_R il_trabajo_actual_relacionado_estudios 
##                              4.7165729                              4.6413580 
##               il_consecuencia_estudios                          tasa_abandono 
##                              4.5384915                              4.4301002 
##                                t_exito                             ste_codalf 
##                              4.2560010                              2.2518062 
##                                 acceso                 sa_curso_participacion 
##                              1.9402109                              1.4058310 
##                  sa_asig_participacion              sa_titulacion_implicacion 
##                              1.3576136                              1.3469626 
##                             sa_curso_R                              sa_asig_R 
##                              1.1201823                              1.0429267 
##                             nota_media              sa_titulacion_comentarios 
##                              0.7544009                              0.6793106 
##              any_anyaca_inicio_2014-19 
##                              0.6598199
 # se obtiene el top25 del PC2 ordenado
 print('El top35 del PC2 ordenado es:')
## [1] "El top35 del PC2 ordenado es:"
 sort(resultados_pca$contrib[, 2], decreasing = T)[1:25]
##                              t_sup_req                        tasa_eficiencia 
##                              6.8563873                              6.2831469 
##                             ste_codalf                                   il_R 
##                              6.1944155                              5.8179710 
##                       il_participacion                      il_trabajo_actual 
##                              5.8179710                              5.6331942 
##                           t_evaluacion                               titulado 
##                              5.5462491                              5.1559402 
##                                 acceso                                t_exito 
##                              5.0521631                              5.0029675 
##                     il_motivo_estudios il_trabajo_actual_relacionado_estudios 
##                              4.5509837                              4.3050644 
##                 n_nodos_fin_titulacion               il_consecuencia_estudios 
##                              4.3026218                              4.1463559 
##                          tasa_abandono                        sa_titulacion_R 
##                              3.7266259                              1.9874727 
##            sa_titulacion_participacion                       cen_codnum_11420 
##                              1.9779607                              1.5283373 
##                 sa_curso_participacion              sa_titulacion_implicacion 
##                              1.3383812                              1.0303557 
##                  sa_asig_participacion                            edad_inicio 
##                              0.9941060                              0.9778073 
##                             sa_curso_R                             nota_media 
##                              0.9708567                              0.9072542 
##                              sa_asig_R 
##                              0.8030056

2.3.6.2 Estudio SVD (Single Value Decomposition).

Se estudia la Descomposición de Valores Únicos y de los valores que lo caracterizan. Para ello es necesario analizar la varianza explicada acumulada.

Se muestra gráficamente cómo varía la varianza explicada acumulada:

# Cálculo de la varianza explicada acumulada 
prop_varianza = df_pca_imp_0$sdev^2/sum(df_pca_imp_0$sdev^2)
prop_varianza_acum = cumsum(prop_varianza)

# Se muestra mediante gráfica cómo varía la varianza explicada acumulada 
ggplot(data = data.frame(prop_varianza_acum, pc = factor(1:ncol(rto_fin_abandono_esc))),
       aes(x = pc, y = prop_varianza_acum, group = 1)) +
  geom_point() +
  geom_line() +
  geom_label(aes(label = round(prop_varianza_acum, 2)), angle = 45, size=2) +
  theme_bw() +
  labs(x = "Componentes principales", 
       y = "Prop. varianza explicada acumulada") + 
  theme(axis.text.x = element_text(angle = 90, vjust = 1, hjust=1, size=8))

Aproximadamente, el 85% de la varianza acumulada se obtiene con el PC33.

prop_varianza_acum[33]
## [1] 0.8529156

Se muestra la proporción de varianza explicada y acumulada de las variables:

summary(df_pca_imp_0)$importance
##                             PC1      PC2      PC3     PC4      PC5      PC6
## Standard deviation     2.723356 2.173923 2.122774 1.79657 1.725447 1.532755
## Proportion of Variance 0.109070 0.069500 0.066270 0.04747 0.043780 0.034550
## Cumulative Proportion  0.109070 0.178570 0.244840 0.29230 0.336080 0.370630
##                             PC7      PC8      PC9     PC10     PC11     PC12
## Standard deviation     1.489567 1.450294 1.334021 1.284519 1.258029 1.227143
## Proportion of Variance 0.032630 0.030930 0.026170 0.024260 0.023270 0.022150
## Cumulative Proportion  0.403260 0.434190 0.460360 0.484630 0.507900 0.530050
##                            PC13    PC14     PC15     PC16     PC17     PC18
## Standard deviation     1.193625 1.17299 1.166936 1.145293 1.140787 1.082779
## Proportion of Variance 0.020950 0.02023 0.020030 0.019290 0.019140 0.017240
## Cumulative Proportion  0.551000 0.57123 0.591260 0.610550 0.629690 0.646930
##                            PC19     PC20     PC21     PC22     PC23      PC24
## Standard deviation     1.077412 1.039783 1.028319 1.022973 1.001629 0.9970835
## Proportion of Variance 0.017070 0.015900 0.015550 0.015390 0.014750 0.0146200
## Cumulative Proportion  0.664000 0.679900 0.695450 0.710840 0.725590 0.7402100
##                             PC25      PC26      PC27      PC28      PC29
## Standard deviation     0.9884982 0.9712716 0.9501853 0.9380098 0.9171278
## Proportion of Variance 0.0143700 0.0138700 0.0132800 0.0129400 0.0123700
## Cumulative Proportion  0.7545800 0.7684500 0.7817300 0.7946700 0.8070400
##                             PC30     PC31      PC32      PC33      PC34
## Standard deviation     0.9047291 0.886985 0.8767462 0.8634407 0.8582044
## Proportion of Variance 0.0120400 0.011570 0.0113000 0.0109600 0.0108300
## Cumulative Proportion  0.8190800 0.830650 0.8419500 0.8529200 0.8637500
##                             PC35      PC36      PC37      PC38     PC39
## Standard deviation     0.8451119 0.8426052 0.8028345 0.7892522 0.778689
## Proportion of Variance 0.0105000 0.0104400 0.0094800 0.0091600 0.008920
## Cumulative Proportion  0.8742500 0.8846900 0.8941700 0.9033300 0.912250
##                             PC40      PC41      PC42      PC43      PC44
## Standard deviation     0.7588257 0.7334881 0.7186603 0.6813001 0.6532749
## Proportion of Variance 0.0084700 0.0079100 0.0076000 0.0068300 0.0062800
## Cumulative Proportion  0.9207100 0.9286300 0.9362200 0.9430500 0.9493200
##                             PC45      PC46      PC47    PC48      PC49
## Standard deviation     0.6277076 0.6094155 0.5995588 0.57679 0.5527973
## Proportion of Variance 0.0057900 0.0054600 0.0052900 0.00489 0.0044900
## Cumulative Proportion  0.9551200 0.9605800 0.9658700 0.97076 0.9752500
##                             PC50      PC51      PC52      PC53      PC54
## Standard deviation     0.4941943 0.4679084 0.4496377 0.4477744 0.4431466
## Proportion of Variance 0.0035900 0.0032200 0.0029700 0.0029500 0.0028900
## Cumulative Proportion  0.9788400 0.9820600 0.9850400 0.9879900 0.9908700
##                             PC55      PC56      PC57     PC58      PC59
## Standard deviation     0.4036481 0.3903443 0.2937787 0.276726 0.2686125
## Proportion of Variance 0.0024000 0.0022400 0.0012700 0.001130 0.0010600
## Cumulative Proportion  0.9932700 0.9955100 0.9967800 0.997910 0.9989700
##                             PC60      PC61       PC62       PC63        PC64
## Standard deviation     0.1989785 0.1693615 0.03302534 0.03015249 2.68663e-06
## Proportion of Variance 0.0005800 0.0004200 0.00002000 0.00001000 0.00000e+00
## Cumulative Proportion  0.9995500 0.9999700 0.99999000 1.00000000 1.00000e+00
##                                PC65         PC66         PC67         PC68
## Standard deviation     1.209413e-15 4.754185e-16 2.867507e-16 2.164675e-16
## Proportion of Variance 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## Cumulative Proportion  1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00

¿Cómo elegir el número óptimo de componentes principales?

Mediante la función fviz_screeplot() del paquete factoextra se genera un scree plot que muestra los eigenvalores (de mayor a menor). De esta forma obtenemos un total de 10 dimensiones, es decir, las 68 variables a analizar se han agrupado en 10 dimensiones de modo que para cada agrupación la variación de las varianzas está optimizada.

# se añade gráfico comparado
layout(matrix(c(1, 2), ncol = 2))


# Se grafica 
fviz_screeplot(df_pca_imp_0, 
               addlabels = TRUE, 
               ylim = c(0, 33)) + 
  labs(title = "Scree plot")

Mediante la función fviz_pca_var() del paquete factoextra se genera un gráfico que muestra la contribución de las 35 variables PCA principales.

# se añade gráfico comparado
layout(matrix(c(1, 2), ncol = 2))

fviz_pca_var(
  df_pca_imp_0,
  axes = c(1, 2),
  repel = FALSE,
  col.var = "black",
  fill.var = "white",
  alpha.var = 1,
  select.var = list(name = NULL, cos2 = NULL, contrib = 33) # se limita al top33
)  + 
  labs(title = "Variables PCA")

Se muestran para las 2 dimensiones principales las variables que están por encima de la media (línea roja discontinua que representa el valor medio de contribución de las variables a la dimensión).

# Se grafica PC1
fviz_contrib(df_pca_imp_0, 
             choice = "var", 
             axes = 1,
             top = 20) + #si se quiere aplicar top o limitar las variables por encima de la media, personalizando
         theme(axis.text.x = element_text(angle = 90))

# Se grafica PC2
fviz_contrib(df_pca_imp_0, 
             choice = "var", 
             axes = 2,
             top = 20) +
         theme(axis.text.x = element_text(angle = 90))

2.3.7 Juego de datos reducido: descripción de variables.

El juego de datos se reduce a las variables que se encuentran por encima de la media en las dos primeras dimensiones:

Quedando compuesto de las siguientes variables:

Variable Descripción Valores Tipo Explotación
ste_codalf Tipo de estudios 0: Grado, 1: Máster Cardinal
titulado Titulación finalizada >=0 Cardinal
tasa_eficiencia 100*ECTS superados/matriculados >=0 Cardinal
t_exito 100*ECTS superados/presentados >=0 Cardinal
t_evaluacion 100*ECTS presentados/matriculados >=0 Cardinal
t_rec 100*ECTS reconocidos/total a superar >=0 Cardinal
t_sup_req 100*ECTS (superados+reconocidos)/total a superar >=0 Cardinal
acceso Tipo acceso presentado 1: Titulado Universitario, 0: No Cardinal
n_nodos_fin_titulacion Nº de nodos de finalización (si >1, distintas especialidades) >=0 Cardinal
tasa_abandono 0: si se titula, no se traslada y tiene matrícula activa en dos últimos cursos; 1: en el resto de casos 1: Sí, 0: No Cardinal
nota_media Media ponderada ECTS superados en Udima >=0 Cardinal
sa_asig_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_asig_participacion Proporción de encuestas respondidas por el estudiante en las asignaturas del plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_asig_organizacion Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem La organización de la asignatura facilita el aprendizaje de esta asignatura. Escala 1-5 >=1 y <= 5 Cardinal
sa_asig_manual Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem El manual facilita el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_materiales Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem Otros materiales didácticos aportados facilitan el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_actividades Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem Las actividades didácticas planteadas facilitan el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_docente Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem La labor del docente facilita el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_aprendiendo Porcentaje de respuestas al ítem ¿Consideras que estás aprendiendo? respecto de las encuestas respondidas por el estudiante en las asignaturas entre 0 y 1 Cardinal
sa_curso_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_curso_participacion Proporción de encuestas respondidas por el estudiante en los cursos matriculados en el plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_curso_titulacion Promedio de valoraciones aportadas por el estudiante en los cursos matriculados en el plan para el ítem ‘Grado de satisfacción general con la titulación’. Escala 1-5 >=1 y <= 5 Cardinal
sa_titulacion_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_titulacion_participacion Proporción de encuestas respondidas por el egresado en los cursos de egreso en el plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_titulacion_implicacion Promedio de valoraciones aportadas por el estudiante en los cursos egresados en el plan para el ítem ‘Mi implicación con los estudios’. Escala 1-5 >=1 y <= 5 Cardinal
il_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
il_participacion Proporción de encuestas respondidas por el egresado en los cursos de egreso y estudios en el plan respecto de las que han sido enviadas (estudios tipo I y II, realizados respectivamente, al año y dos años de egresar) entre 0 y 1 Cardinal
il_consecuencia_estudios Valoración aportada por el egresado en los estudios tipo I y II en el plan para el ítem ¿Qué ha supuesto la realización de los estudios? 1: Conseguir o mejorar un empleo; 0: No variación u Otro Cardinal

Nota: t_rec y t_sup_req pueden superar el 100% ya que están calculadas frentes a los ECTS requeridos para finalizar la titulación, pero pueden superarse más ECTS de los requeridos (optativas, menciones, especialidades).

Representatividad de la muestra (determina si la muestra es estadísticamente significativa): Dado que las respuestas recibidas responden a un muestreo se determina la obtención de muestra representativa mediante la fórmula:

\[Muestra\ representativa\ (n)\ = \frac{\frac{z^{2}\ p\ (1-p)\ }{e^{2}}}{1 + \frac{z^{2}\ p\ (1-p)\ }{e^{2} N\ }}\]

Siendo:

  • Nivel de confianza (NC) del 80%, lo que implica Z-score (z) de 1.282.

  • Proporción esperada (p): para maximizar el tamaño muestral será de 0.5 (50%).

  • Error muestral (e) del 10%.

  • Población (N): cantidad total de usuarios a los que se invita a participar en el estudio.

variables_svd = c("ste_codalf", "acceso", "t_sup_req", "t_rec", "nota_media",
                  "tasa_abandono", "titulado", "n_nodos_fin_titulacion", "duracion_media_estudios",
                  "tasa_eficiencia", "t_exito", "t_evaluacion", "edad_inicio",
                  "sa_asig_R", "sa_asig_participacion",
                  "sa_asig_actividades", "sa_asig_organizacion", "sa_asig_manual", 
                  "sa_asig_materiales", "sa_asig_docente", "sa_asig_aprendiendo", 
                  "sa_curso_R", "sa_curso_participacion", "sa_curso_titulacion", 
                  "sa_titulacion_R", "sa_titulacion_participacion", "sa_titulacion_implicacion",
                  "il_R", "il_participacion", "il_consecuencia_estudios",
                  "il_motivo_estudios", "il_trabajo_actual", "il_trabajo_actual_relacionado_estudios")

rto_total_red = data_dummy_esc %>%
  select(variables_svd)

# se filtran los datos de titulados
rto_fin_red = rto_total_red %>%
  filter(titulado > min(titulado))

# se filtran los datos de no titulados
rto_no_fin_red = rto_total_red %>%
  filter(titulado == min(titulado))

# se filtran los datos de abandonos
rto_abandono_red = rto_no_fin_red %>%
  filter(tasa_abandono == max(tasa_abandono))

# se obtiene juego de datos de titulados y abandono (fusión)
rto_fin_abandono_red = rbind(rto_fin_red,
                             rto_abandono_red)

# se filtran los datos en progreso
rto_progreso_red = rto_no_fin_red %>%
  filter(tasa_abandono == min(tasa_abandono))

2.4 Fase IV. Modeling o modelado.

En esta fase, el objetivo es modelar las técnicas que son necesarias para resolver el objetivo principal del proyecto (mediante los objetivos específicos).

Como ya se anunció en la Fase I del proyecto, el objetivo del mismo se puede resolver mediante minería de datos a través del establecimiento de los siguientes objetivos específicos:

  • Identificar los perfiles del estudiantado universitario de Grado o Máster de la Udima que finaliza o abandona sus estudios. Esto se realizará mediante la clasificación de los individuos en grupos homogéneos mediante técnicas de aprendizaje no supervisadas para conocer la similitud entre los mismos y la clasificación, que es desconocida a priori. Para ello, se aplicarán métodos de agregación o análisis cluster.

  • Determinar las características principales de los perfiles del estudiantado. Para ello, se aplicarán estadísticas básicas.

  • Predecir la clasificación de los estudiantes que no han finalizado los estudios en base a sus resultados parciales de rendimiento académico, opiniones manifestadas, características sociodemográficas y de comportamiento en el LMS utilizado. Para ello se aplicarán técnicas de aprendizaje supervisado: clasificación.

2.4.1 Objetivo específico 1: Identificar los perfiles del estudiantado que finaliza o abandona sus estudios.

Para identificar los perfiles del estudiantado que finaliza o abandona sus estudios se va a clasificar a los individuos en grupos homogéneos mediante técnicas multivariantes exploratorias, obteniendo la similitud entre los mismos y la clasificación, que es desconocida a priori. Para ello, se aplicarán métodos de agregación o análisis cluster (métodos no supervisados basados en el concepto de distancia).

Los métodos de agrupación permiten explorar los datos para encontrar similitudes. Se parte de un caso en el que el número de agrupaciones (o clusters) es desconocido, por lo que, es necesario determinar la métrica y el algoritmo de agrupamiento a aplicar.

2.4.1.1 Métrica, algoritmo de agrupación y número de clusters óptimos.

Como uno de los algoritmos a evaluar será k-means, que está basado en distancias, es necesario:

  • no contar con registros que contengan datos ausentes. Los datos ausentes han sido sustituidos por 0 o por la mediana, según el caso. Esta condición ha sido previamente aplicada en el juego de datos.

  • contar con las variables numéricas normalizadas para que todas las variables aportan la misma importancia en el cálculo de los centroides. Esta condición ha sido previamente aplicada en el juego de datos.

Mediante la función clValid del paquete clValid se evalúan distintas métricas y métodos para conocer el algoritmo y número óptimo de clusters.

El método con la mínima conectividad y máximos índices dunn y ancho de la silueta determina la combinación óptima: esto sucede con el algoritmo k-means, distancia euclidiana y 2 clusters.

Las medidas de validación de este método superan a las de otros algoritmos de agrupación para casi todas las agrupaciones evaluadas (2 a 5), siendo óptimo k=2.

# https://stackoverflow.com/questions/54785297/configuring-mkl-with-r

# se evalúan las distintas métricas y métodos para conocer el número óptimo de clusters
# t1 = Sys.time()
# gc()

eval_cluster  = clValid(rto_fin_abandono_red,
                        nClust = 2:5,
                        clMethods = c("kmeans", "pam"), 
                        validation = "internal",
                        maxitems = nrow(rto_fin_abandono_red),
                        verbose = TRUE)

# t2 = Sys.time()
# total = t2 - t1

# se muestran resultados
summary(eval_cluster)

# print(paste0('Tiempo de ejecución: ', total))

Comparación kmeans y pam de 2 a 5 clusters

2.4.1.2 Aplicación del algoritmo de agrupamiento (k-means), métrica: distancia euclidiana y determinación del número de clusters.

A continuación se van a explorar distintos métodos para determinar el número de clusters a aplicar.

2.4.1.2.1 Método de la silueta promedio.

Este método consiste en determinar las agrupaciones óptimas obtenidas cuando la anchura de la silueta promedio tiene el mayor valor.

Mediante la función fviz_nbclust de la librería factoextra, similar al método elbow (del codo), se calcula el “método de silueta promedio” obteniendo que el número óptimo de clusters es 2. Esto viene determinado por el valor máximo del promedio de silueta promedio, no obstante, esto sería una agrupación poco rica en detalles, ya que definiría a los estudiantes que egresan y a los que abandonan. Por este motivo, se descarta agrupar en 2 clusters y se decide agrupar en el siguiente nivel máximo: se decide agrupar en 4 clusters.

# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

# Se representa en una gráfica fviz_nbclust los valores de las siluetas media de cada prueba realizada para determinar el número óptimo de clusters.
fviz_nbclust(rto_fin_abandono_red,
             kmeans, 
             method = "silhouette", 
             k.max = 5) +
  labs(subtitle = "Método de la silueta promedio")

2.4.1.2.2 Método elbow (el codo).

Este método selecciona el número de clusters en función de la menor suma de los cuadrados de las distancias de los puntos de cada grupo con respecto a su centro (withinss), con la mayor separación entre centros de grupos (betweenss).

Al graficarlo, el número de clusters óptimo se encuentra en el “codo” de la curva. Se realiza la prueba con hasta 10 clusters y se determina que el número óptimo de clusters es 4.

# Se representa en una gráfica los valores de las distancias de cada prueba realizada para determinar el número óptimo de clusters.
fviz_nbclust(rto_fin_abandono_red,
             kmeans,
             method = "wss",
             k.max = 10) +
  labs(subtitle = "Método elbow (el Codo)")
# Forma alternativa de obtener el gráfico de sedimentación (gráfico de codo)
wss = (nrow(rto_fin_abandono_red)-1)*sum(apply(rto_fin_abandono_red, 2, var))

# se obtienen los centros
for (i in 2:10) wss[i] = sum(kmeans(rto_fin_abandono_red,
                                    centers = i)$withinss)

# Se representa
ggplot() + geom_point(aes(x = 1:10, y = wss), color = 'blue') +
  geom_line(aes(x = 1:10, y = wss), color = 'blue') +
  ggtitle("Método elbow (el Codo)") +
  xlab('Número de clusters') +
  ylab('Variabilidad dentro del grupo')

2.4.1.3 Calidad del agrupamiento con 2 y 4 clusters.

Se comprueba la calidad del agrupamiento con 2 y 4 clusters clusters y se fuerza al algoritmo a elegir 100 conjuntos de centros de inicio aleatorios (indicando ‘nstart = 100’).

Se comprueba la calidad del agrupamiento con 2 clusters:

  • Se visualizan los clusters mediante la función clusplot.
# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

# Se aplica el algoritmo kmeans con 2 clusters
fit2       = kmeans(rto_fin_abandono_red, 2, nstart = 100)

# Se crea una variable que contiene para cada muestra el identificador del *cluster* a las que han sido asignadas, es decir, las muestras que han asignadas al cluster 1 y 2
y_cluster2 = fit2$cluster

# Se visualizan los clusters mediante la función clusplot. 
clusplot(rto_fin_abandono_red, 
         fit2$cluster, 
         color = TRUE,
         shade = TRUE,
         labels = 6,
         lines = 1)

# sin variables dummy para indicar el valor original categórico
rto_fin_abandono_k2 = rto_fin_abandono

# se añade la clasificación a la bbdd 
rto_fin_abandono_k2$cluster = y_cluster2

# se obtienen las distintas bases de datos asociadas a cada perfil
perfil_1_k2 = rto_fin_abandono_k2 %>% filter(cluster == 1)
perfil_2_k2 = rto_fin_abandono_k2 %>% filter(cluster == 2)

Se muestra la distribución por tipo de perfil en la clasificación de estudiantes en 2 clusters:

# se grafican los boxplot
par(mfrow = c(1, 2))

# ste_codalf
boxplot(ste_codalf ~ cluster, 
        data = rto_fin_abandono_k2, 
        main = "Tipo de estudios: 0, Grado; 1, Máster")
# se añade valor medio
abline(h = mean(rto_fin_abandono_k2$ste_codalf, na.rm = TRUE), 
       col = "red", lty = 2)


# titulado
boxplot(titulado ~ cluster, 
        data = rto_fin_abandono_k2, 
        main = "Titulado: 0, No")
# se añade valor medio
abline(h = mean(rto_fin_abandono_k2$titulado, na.rm = TRUE), 
       col = "red", lty = 2)

# se grafican los boxplot
par(mfrow = c(1, 3))

# tasa_eficiencia
boxplot(tasa_eficiencia ~ cluster, 
        data = rto_fin_abandono_k2, 
        main = "Tasa de eficiencia")
# se añade valor medio
abline(h = mean(rto_fin_abandono_k2$tasa_eficiencia, na.rm = TRUE), 
       col = "red", lty = 2)


# t_exito
boxplot(t_exito ~ cluster, 
        data = rto_fin_abandono_k2, 
        main = "Tasa de éxito")
# se añade valor medio
abline(h = mean(rto_fin_abandono_k2$t_exito, na.rm = TRUE), 
       col = "red", lty = 2)


# t_evaluacion
boxplot(t_evaluacion ~ cluster, 
        data = rto_fin_abandono_k2, 
        main = "Tasa de evaluación")
# se añade valor medio
abline(h = mean(rto_fin_abandono_k2$t_evaluacion, na.rm = TRUE), 
       col = "red", lty = 2)

  • Mediante la función silhouette que evalúa la calidad del proceso de agregación se obtiene para cada muestra, el cluster dónde ha sido asignado, el cluster vecino y el valor de la silueta. Por lo tanto, calculando la media de la tercera columna podemos obtener una estimación de la calidad del agrupamiento del método de 2 clusters.
# Mediante la función silhouette que evalúa la calidad del proceso de agregación
df_similitud = daisy(rto_fin_abandono_red) 

calidad_cluster2 = silhouette(y_cluster2, 
                              df_similitud)

# La función silhouette devuelve para cada muestra, el cluster dónde ha sido asignado, el cluster vecino y el valor de la silueta. Por lo tanto, calculando la media de la tercera columna podemos obtener una estimación de la calidad del agrupamiento
v_calidad_cluster2 = mean(calidad_cluster2[, 'sil_width'])

De nuevo, se comprueba la calidad del agrupamiento, esta vez con 4 clusters:

  • Se visualizan los clusters mediante la función clusplot y se muestra cómo el algoritmo determina las agrupaciones que minimizan la variabilidad.
# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

# Se aplica el algoritmo kmeans con 4 clusters y se fuerza al algoritmo a elegir 100 conjuntos de centros de inicio aleatorios 
fit4       = kmeans(rto_fin_abandono_red, 4, nstart = 100)

# Se crea una variable que contiene para cada muestra el identificador del cluster a las que han sido asignadas, es decir, las muestras que han asignadas al cluster 1, 2, 3 y 4
y_cluster4 = as.factor(fit4$cluster)

# Se visualizan los clusters mediante la función clusplot. 
clusplot(rto_fin_abandono_red, 
         fit4$cluster, 
         color = TRUE,
         shade = TRUE,
         labels = 6,
         lines = 1)

# se muestran los resultados del algoritmo
# fit4
  • Mediante la función silhouette que evalúa la calidad del proceso de agregación se obtiene para cada muestra, el cluster donde ha sido asignado, el cluster vecino y el valor de la silueta. Por lo tanto, calculando la media de la tercera columna podemos obtener una estimación de la calidad del agrupamiento del método de 4 clusters.
# Mediante la función silhouette que evalúa la calidad del proceso de agregación
calidad_cluster4 = silhouette(as.numeric(y_cluster4), 
                              df_similitud)

# La función silhouette devuelve para cada muestra, el cluster dónde ha sido asignado, el cluster vecino y el valor de la silueta. Por lo tanto, calculando la media de la tercera columna podemos obtener una estimación de la calidad del agrupamiento
v_calidad_cluster4 = mean(calidad_cluster4[, 'sil_width'])

La estimación de la calidad del agrupamiento del método de 2 cluster es 0.4768182 mientras que la de 4 es 0.3251001.

De esta forma, la clasificación óptima sería:

# representación
fviz_cluster(fit4, data = rto_fin_abandono_red)

2.4.1.4 Justificación de la métrica, algoritmo de agrupación y número de clusters a aplicar.

Pese a que la estimación de la calidad del agrupamiento del método de 2 cluster (0.4768182), que es mayor que la de 4 (0.3251001), y que la función clValid determina que los resultados óptimos se obtienen con el algoritmo k-means, métrica: distancia euclidiana y 2 clusters, se descarta agrupar en 2 clusters y se decide agrupar en el siguiente nivel máximo: 4 clusters, con el algoritmo k-means y métrica: distancia euclidiana como sugiere el método elbow (el codo), el método de la silueta promedio (mediante la función fviz_nbclust).

2.4.1.5 Conclusiones obtenidas de las técnicas de aprendizaje no supervisadas.

Se obtienen las siguientes conclusiones:

  • La mayor fiabilidad del proceso se obtiene aplicando un juego de datos normalizado mediante la función scale para que las variables tengan media 0 y desviación típica 1 para poder aplicar el algoritmo k-means que está basado en distancias. De esta forma, todas las variables aportan la misma importancia en el cálculo de los centroides. Para poder agrupar los datos, es necesario no tener datos ausentes.

  • Para avanzar en esta tarea se puede hacer uso de la función NbClust que analiza mediante distintos métodos y medidas cuál es el número óptimo de clusters. Se puede personalizar la función para indicar (o no) el número mínimo y máximo de clusters; o por el contrario, no limitarlo y que evalúe todas las opciones.

  • Determinar el algoritmo, la métrica y el número óptimo de clusters no es trivial y su evaluación requiere de ala capacidad computacional. Los resultados que ofrece el método elbow (el codo) se consideran óptimo ya que selecciona el número de clusters en función de la menor suma de los cuadrados de las distancias de los puntos de cada grupo con respecto a su centro (withinss), con la mayor separación entre centros de grupos (betweenss). Al graficarlo, el número de clusters óptimo se encuentra en el “codo” de la curva.

  • Otro aspecto a valorar es la calidad del proceso de agregación. A mayor valor, mayor calidad. Mediante este análisis se concluye que el criterio de agrupación con mayor calidad es 4 clusters en lugar del de 2.

Por último, en el caso del ejemplo concreto, ha quedado de manifiesto que la agrupación en 4 clusters es la más fiable si no partimos de una preclasificación determinada (0.3251001) y según el problema planteado.

2.4.2 Objetivo específico 2: Determinar las características principales que definen a un estudiante que finaliza o abandona sus estudios.

Partiendo de la clasificación en 4 clusters, con el algoritmo k-means y métrica distancia euclidiana se obtienen las distintas bases de datos así como sus características principales:

# se crea bbdd reducida con clasificación y valores orifinales
rto_fin_abandono_clas = rto_fin_abandono %>%
  select(variables_svd)

# se añade la clasificación a la bbdd 
rto_fin_abandono_clas$cluster = y_cluster4

# se obtienen las distintas bases de datos asociadas a cada perfil
perfil_1 = rto_fin_abandono_clas %>% filter(cluster == 1)
perfil_2 = rto_fin_abandono_clas %>% filter(cluster == 2)
perfil_3 = rto_fin_abandono_clas %>% filter(cluster == 3)
perfil_4 = rto_fin_abandono_clas %>% filter(cluster == 4)
# salida para memoria

# se define función para tener mostrar comparación de resultados
comparacion_item = function(x){
  resultados = c(paste0(#'Mean (sd): ',
                        round(mean(perfil_1[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_1[[x]], na.rm=TRUE), 1),')'),
                 paste0(#'Mean (sd): ',
                        round(mean(perfil_2[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_2[[x]], na.rm=TRUE), 1),')'), 
                 paste0(#'Mean (sd): ',
                        round(mean(perfil_3[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_3[[x]], na.rm=TRUE), 1),')'), 
                 paste0(#'Mean (sd): ',
                        round(mean(perfil_4[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_4[[x]], na.rm=TRUE), 1),')')
               )
  
  return(resultados)
}

# Comparación clasificación-predicción
comparacion = data.frame(
  perfil = c('dropout',
             'common_graduate',
             'motivated',
             'dissatisfied'),
  "proporción" = c(paste0(nrow(perfil_1),
                          " (", round(100*nrow(perfil_1)/nrow(rto_fin_abandono), 2), "%)"),
                   paste0(nrow(perfil_2),
                          " (", round(100*nrow(perfil_2)/nrow(rto_fin_abandono), 2), "%)"),
                   paste0(nrow(perfil_3),
                          " (", round(100*nrow(perfil_3)/nrow(rto_fin_abandono), 2), "%)"),
                   paste0(nrow(perfil_4),
                          " (", round(100*nrow(perfil_4)/nrow(rto_fin_abandono), 2), "%)")
              ),
  'edad_inicio' = comparacion_item('edad_inicio'),
  'titulado' = comparacion_item('titulado'),
  'n_especialidades' = comparacion_item('n_nodos_fin_titulacion'),
  't_sup_req' = comparacion_item('t_sup_req'),
  't_rec' = comparacion_item('t_rec'),
  'nota_media' = comparacion_item('nota_media'),
  'tasa_eficiencia' = comparacion_item('tasa_eficiencia'),
  't_exito' = comparacion_item('t_exito'),
  't_evaluacion' = comparacion_item('t_evaluacion'),
  'sa_asig_participacion' = comparacion_item('sa_asig_participacion'),
  'sa_asig_docente' = comparacion_item('sa_asig_docente'),
  'sa_asig_aprendiendo' = comparacion_item('sa_asig_aprendiendo'),
  'sa_curso_participacion' = comparacion_item('sa_curso_participacion'),
  'sa_curso_titulacion' = comparacion_item('sa_curso_titulacion'),
  'sa_titulacion_participacion' = comparacion_item('sa_titulacion_participacion'),
  'sa_titulacion_implicacion' = comparacion_item('sa_titulacion_implicacion'),
  'il_participacion' = comparacion_item('il_participacion'),
  'il_trabajo_actual_relacionado_estudios' = comparacion_item('il_trabajo_actual_relacionado_estudios')
)


comparacion_t = data.frame(t(comparacion[-1]))
# Añadimos los nombres de las columnas
colnames(comparacion_t) = comparacion[, 1]

# se exportan resultados a latex
print(xtable(comparacion_t), include.rownames = TRUE)

Se muestra la distribución por tipo de perfil en las 10 primeras variables con mayor varianza explicada y acumulada identificadas mediante el estudio SVD.

# se grafican los boxplot
par(mfrow = c(1, 3))

# ste_codalf
boxplot(ste_codalf ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "Tipo de estudios: 0, Grado; 1, Máster")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$ste_codalf, na.rm = TRUE), 
       col = "red", lty = 2)


# titulado
boxplot(titulado ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "Titulado: 0, No")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$titulado, na.rm = TRUE), 
       col = "red", lty = 2)


# duracion_media_estudios
boxplot(duracion_media_estudios ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "Titulado: 0, No")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$duracion_media_estudios, na.rm = TRUE), 
       col = "red", lty = 2)

# se grafican los boxplot
par(mfrow = c(1, 3))

# tasa_eficiencia
boxplot(tasa_eficiencia ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "Tasa de eficiencia")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$tasa_eficiencia, na.rm = TRUE), 
       col = "red", lty = 2)


# t_exito
boxplot(t_exito ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "Tasa de éxito")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$t_exito, na.rm = TRUE), 
       col = "red", lty = 2)


# t_evaluacion
boxplot(t_evaluacion ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "Tasa de evaluación")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$t_evaluacion, na.rm = TRUE), 
       col = "red", lty = 2)

# se grafican los boxplot
par(mfrow = c(1, 2))

# t_rec
boxplot(t_rec ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "% ECTS reconocidos")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$t_rec, na.rm = TRUE),
       col = "red", lty = 2)


# t_sup_req
boxplot(t_sup_req ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "% ECTS superados o reconocidos")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$t_sup_req, na.rm = TRUE),
       col = "red", lty = 2)

Se muestra la distribución de otras variables características del estudiantado:

# se grafican los boxplot
par(mfrow = c(1, 2))

# acceso
boxplot(acceso ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "Tipo de acceso: 1, Título universitario")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$acceso, na.rm = TRUE), 
       col = "red", lty = 2)


# nota_media
boxplot(nota_media ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "Nota media")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$nota_media, na.rm = TRUE), 
       col = "red", lty = 2)

También se muestra la distribución de participación en las encuestas:

# se grafican los boxplot
par(mfrow = c(1, 4))

# sa_asig_participacion
boxplot(sa_asig_participacion ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "% encuestas asignaturas")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$sa_asig_participacion, na.rm = TRUE),
       col = "red", lty = 2)


# sa_curso_participacion
boxplot(sa_curso_participacion ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "% encuestas curso")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$sa_curso_participacion, na.rm = TRUE),
       col = "red", lty = 2)

# sa_titulacion_participacion
boxplot(sa_titulacion_participacion ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "% encuestas titulación")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$sa_titulacion_participacion, na.rm = TRUE),
       col = "red", lty = 2)


# il_participacion
boxplot(il_participacion ~ cluster, 
        data = rto_fin_abandono_clas, 
        main = "% estudio inserción laboral")
# se añade valor medio
abline(h = mean(rto_fin_abandono_clas$il_participacion, na.rm = TRUE),
       col = "red", lty = 2)

2.4.2.1 Clasificación del perfil 1 del estudiantado: Dropout (25.09%): Estudiante que abandona los estudios.

El 25.09% del estudiantado analizado pertenece a esta categoría. Se caracteriza por:

  • egresar en 0 especialidad/es en una media de 1.67 años;

  • con tasas de rendimiento (eficiencia, éxito y evaluación) superiores al 41%;

  • superar, frente a los ECTS requeridos para obtener la titulación, una media del 24.15% (se superan más ECTS de los requeridos, pudiendo obtener distintas especialidades o superar asignaturas optativas adicionales) y reconocer un 3.92% de los requeridos;

  • obtener una nota media de 7.56;

  • participación en las encuestas del (asignaturas (10.55%), curso (3.74%), 0% en inserción laboral y 0% en titulación) y satisfacción media en asignaturas manifestada de 4.27.

A continuación se muestra el detalle la información descriptiva del perfil del estudiantado, incluyendo gráficos para cada variable, las frecuencias para cada valor y las etiquetas de las variables.

# https://cran.r-project.org/web/packages/summarytools/vignettes/rmarkdown.html#using-dfsummary-in-r-markdown
# se visualiza 
dfSummary(perfil_1, 
          plain.ascii  = FALSE,
          style        = 'grid',
          graph.magnif = 0.85,
          varnumbers = FALSE,
          valid.col    = FALSE,
          tmp.img.dir  = "/tmp")

2.4.3 Data Frame Summary

2.4.3.1 perfil_1

Dimensions: 7747 x 34
Duplicates: 1602

Variable Stats / Values Freqs (% of Valid) Graph Missing
ste_codalf
[numeric]
Min : 0
Mean : 0.3
Max : 1
0 : 5161 (66.6%)
1 : 2586 (33.4%)
0
(0.0%)
acceso
[numeric]
Min : 0
Mean : 0.5
Max : 1
0 : 3734 (48.2%)
1 : 4013 (51.8%)
0
(0.0%)
t_sup_req
[numeric]
Mean (sd) : 24.1 (30.4)
min < med < max:
0 < 10 < 125
IQR (CV) : 37.5 (1.3)
211 distinct values 0
(0.0%)
t_rec
[numeric]
Mean (sd) : 3.9 (10.5)
min < med < max:
0 < 0 < 86.7
IQR (CV) : 0 (2.7)
105 distinct values 0
(0.0%)
nota_media
[numeric]
Mean (sd) : 7.6 (0.9)
min < med < max:
2.1 < 7.9 < 10
IQR (CV) : 0.9 (0.1)
2090 distinct values 0
(0.0%)
tasa_abandono
[numeric]
1 distinct value 1 : 7747 (100.0%) 0
(0.0%)
titulado
[numeric]
1 distinct value 0 : 7747 (100.0%) 0
(0.0%)
n_nodos_fin_titulacion
[numeric]
1 distinct value 0 : 7747 (100.0%) 0
(0.0%)
duracion_media_estudios
[numeric]
Mean (sd) : 1.7 (1.1)
min < med < max:
1 < 1 < 10
IQR (CV) : 1 (0.6)
1 : 4528 (58.4%)
2 : 2104 (27.2%)
3 : 640 ( 8.3%)
4 : 264 ( 3.4%)
5 : 116 ( 1.5%)
6 : 50 ( 0.6%)
7 : 26 ( 0.3%)
8 : 8 ( 0.1%)
9 : 7 ( 0.1%)
10 : 4 ( 0.1%)
0
(0.0%)
tasa_eficiencia
[numeric]
Mean (sd) : 41.4 (37.5)
min < med < max:
0 < 35.5 < 100
IQR (CV) : 76.2 (0.9)
724 distinct values 0
(0.0%)
t_exito
[numeric]
Mean (sd) : 58.5 (43.5)
min < med < max:
0 < 76.9 < 100
IQR (CV) : 100 (0.7)
437 distinct values 0
(0.0%)
t_evaluacion
[numeric]
Mean (sd) : 50.6 (38.2)
min < med < max:
0 < 51.9 < 100
IQR (CV) : 84.4 (0.8)
718 distinct values 0
(0.0%)
edad_inicio
[numeric]
Mean (sd) : 32.6 (9.2)
min < med < max:
17 < 31 < 78
IQR (CV) : 13 (0.3)
58 distinct values 0
(0.0%)
sa_asig_R
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 7364 (95.1%)
1 : 383 ( 4.9%)
0
(0.0%)
sa_asig_participacion
[numeric]
Mean (sd) : 10.5 (25.4)
min < med < max:
0 < 0 < 100
IQR (CV) : 0 (2.4)
183 distinct values 0
(0.0%)
sa_asig_actividades
[numeric]
Mean (sd) : 4.3 (0.3)
min < med < max:
1 < 4.3 < 5
IQR (CV) : 0 (0.1)
100 distinct values 0
(0.0%)
sa_asig_organizacion
[numeric]
Mean (sd) : 4.3 (0.2)
min < med < max:
1 < 4.3 < 5
IQR (CV) : 0 (0)
73 distinct values 0
(0.0%)
sa_asig_manual
[numeric]
Mean (sd) : 4 (0.3)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
119 distinct values 0
(0.0%)
sa_asig_materiales
[numeric]
Mean (sd) : 4.2 (0.2)
min < med < max:
1 < 4.2 < 5
IQR (CV) : 0 (0.1)
75 distinct values 0
(0.0%)
sa_asig_docente
[numeric]
Mean (sd) : 4.5 (0.2)
min < med < max:
1 < 4.4 < 5
IQR (CV) : 0 (0.1)
88 distinct values 0
(0.0%)
sa_asig_aprendiendo
[numeric]
Mean (sd) : 90.3 (7.1)
min < med < max:
6.7 < 90.9 < 100
IQR (CV) : 0 (0.1)
55 distinct values 0
(0.0%)
sa_curso_R
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 7536 (97.3%)
1 : 211 ( 2.7%)
0
(0.0%)
sa_curso_participacion
[numeric]
Mean (sd) : 3.7 (17.6)
min < med < max:
0 < 0 < 100
IQR (CV) : 0 (4.7)
0.00 : 7376 (95.2%)
25.00 : 2 ( 0.0%)
33.33 : 21 ( 0.3%)
40.00 : 1 ( 0.0%)
50.00 : 120 ( 1.5%)
66.67 : 16 ( 0.2%)
100.00 : 211 ( 2.7%)
0
(0.0%)
sa_curso_titulacion
[numeric]
Mean (sd) : 4 (0.2)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
12 distinct values 0
(0.0%)
sa_titulacion_R
[numeric]
1 distinct value 0 : 7747 (100.0%) 0
(0.0%)
sa_titulacion_participacion
[numeric]
1 distinct value 0 : 7747 (100.0%) 0
(0.0%)
sa_titulacion_implicacion
[numeric]
1 distinct value 5 : 7747 (100.0%) 0
(0.0%)
il_R
[numeric]
1 distinct value 0 : 7747 (100.0%) 0
(0.0%)
il_participacion
[numeric]
1 distinct value 0 : 7747 (100.0%) 0
(0.0%)
il_consecuencia_estudios
[numeric]
1 distinct value 0 : 7747 (100.0%) 0
(0.0%)
il_motivo_estudios
[numeric]
1 distinct value 0 : 7747 (100.0%) 0
(0.0%)
il_trabajo_actual
[numeric]
1 distinct value 0 : 7747 (100.0%) 0
(0.0%)
il_trabajo_actual_relacionado_estudios
[numeric]
1 distinct value 0 : 7747 (100.0%) 0
(0.0%)
cluster
[factor]
1. 1
2. 2
3. 3
4. 4
7747 (100.0%)
0 ( 0.0%)
0 ( 0.0%)
0 ( 0.0%)
0
(0.0%)

2.4.3.2 Clasificación del perfil 2 del estudiantado: Common graduate (59.59%): Egresado común.

El 59.59% del estudiantado analizado pertenece a esta categoría. Se caracteriza por:

  • egresar en 1.04 especialidad/es en una media de 1.83 años;

  • con tasas de rendimiento (eficiencia, éxito y evaluación) superiores al 97%;

  • superar, frente a los ECTS requeridos para obtener la titulación, una media del 102.55% (se superan más ECTS de los requeridos, pudiendo obtener distintas especialidades o superar asignaturas optativas adicionales) y reconocer un 7.87% de los requeridos;

  • obtener una nota media de 8.04;

  • participación en las encuestas del (asignaturas (15.13%), curso (10.57%), 0.26% en inserción laboral y 9.87% en titulación) y satisfacción media en asignaturas manifestada de 4.3;

  • su trabajo actual está relacionado con los estudios.

A continuación se muestra el detalle la información descriptiva del perfil del estudiantado, incluyendo gráficos para cada variable, las frecuencias para cada valor y las etiquetas de las variables.

# se visualiza 
dfSummary(perfil_2, 
          plain.ascii  = FALSE,
          style        = 'grid',
          graph.magnif = 0.85,
          varnumbers = FALSE,
          valid.col    = FALSE,
          tmp.img.dir  = "/tmp")

2.4.4 Data Frame Summary

2.4.4.1 perfil_2

Dimensions: 18399 x 34
Duplicates: 1424

Variable Stats / Values Freqs (% of Valid) Graph Missing
ste_codalf
[numeric]
Min : 0
Mean : 0.9
Max : 1
0 : 1946 (10.6%)
1 : 16453 (89.4%)
0
(0.0%)
acceso
[numeric]
Min : 0
Mean : 0.9
Max : 1
0 : 1241 ( 6.7%)
1 : 17158 (93.3%)
0
(0.0%)
t_sup_req
[numeric]
Mean (sd) : 102.6 (7.1)
min < med < max:
25 < 100 < 166.7
IQR (CV) : 0 (0.1)
47 distinct values 0
(0.0%)
t_rec
[numeric]
Mean (sd) : 7.9 (14.3)
min < med < max:
0 < 0 < 106.7
IQR (CV) : 10 (1.8)
185 distinct values 0
(0.0%)
nota_media
[numeric]
Mean (sd) : 8 (0.7)
min < med < max:
5.5 < 8.1 < 9.9
IQR (CV) : 1 (0.1)
7077 distinct values 0
(0.0%)
tasa_abandono
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 18206 (99.0%)
1 : 193 ( 1.0%)
0
(0.0%)
titulado
[numeric]
Mean (sd) : 1 (0.1)
min < med < max:
0 < 1 < 3
IQR (CV) : 0 (0.1)
0 : 193 ( 1.0%)
1 : 18033 (98.0%)
2 : 168 ( 0.9%)
3 : 5 ( 0.0%)
0
(0.0%)
n_nodos_fin_titulacion
[numeric]
Mean (sd) : 1 (0.3)
min < med < max:
0 < 1 < 4
IQR (CV) : 0 (0.3)
0 : 193 ( 1.0%)
1 : 17545 (95.4%)
2 : 435 ( 2.4%)
3 : 215 ( 1.2%)
4 : 11 ( 0.1%)
0
(0.0%)
duracion_media_estudios
[numeric]
Mean (sd) : 1.8 (1.1)
min < med < max:
1 < 2 < 13
IQR (CV) : 1 (0.6)
13 distinct values 0
(0.0%)
tasa_eficiencia
[numeric]
Mean (sd) : 97.5 (6.8)
min < med < max:
34.9 < 100 < 100
IQR (CV) : 0 (0.1)
518 distinct values 0
(0.0%)
t_exito
[numeric]
Mean (sd) : 99.2 (3.3)
min < med < max:
57.1 < 100 < 100
IQR (CV) : 0 (0)
275 distinct values 0
(0.0%)
t_evaluacion
[numeric]
Mean (sd) : 98.2 (5.5)
min < med < max:
37.5 < 100 < 100
IQR (CV) : 0 (0.1)
506 distinct values 0
(0.0%)
edad_inicio
[numeric]
Mean (sd) : 29.9 (7.5)
min < med < max:
17 < 27 < 74
IQR (CV) : 10 (0.3)
50 distinct values 0
(0.0%)
sa_asig_R
[numeric]
Min : 0
Mean : 0.1
Max : 1
0 : 16812 (91.4%)
1 : 1587 ( 8.6%)
0
(0.0%)
sa_asig_participacion
[numeric]
Mean (sd) : 15.1 (30.1)
min < med < max:
0 < 0 < 100
IQR (CV) : 8.3 (2)
401 distinct values 0
(0.0%)
sa_asig_actividades
[numeric]
Mean (sd) : 4.3 (0.3)
min < med < max:
2.6 < 4.3 < 5
IQR (CV) : 0 (0.1)
147 distinct values 0
(0.0%)
sa_asig_organizacion
[numeric]
Mean (sd) : 4.4 (0.2)
min < med < max:
3 < 4.3 < 5
IQR (CV) : 0 (0)
126 distinct values 0
(0.0%)
sa_asig_manual
[numeric]
Mean (sd) : 4.1 (0.3)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
177 distinct values 0
(0.0%)
sa_asig_materiales
[numeric]
Mean (sd) : 4.2 (0.2)
min < med < max:
2 < 4.2 < 5
IQR (CV) : 0 (0.1)
136 distinct values 0
(0.0%)
sa_asig_docente
[numeric]
Mean (sd) : 4.5 (0.2)
min < med < max:
1 < 4.4 < 5
IQR (CV) : 0 (0.1)
141 distinct values 0
(0.0%)
sa_asig_aprendiendo
[numeric]
Mean (sd) : 90.2 (8.4)
min < med < max:
3 < 90.9 < 100
IQR (CV) : 0 (0.1)
162 distinct values 0
(0.0%)
sa_curso_R
[numeric]
Min : 0
Mean : 0.1
Max : 1
0 : 17007 (92.4%)
1 : 1392 ( 7.6%)
0
(0.0%)
sa_curso_participacion
[numeric]
Mean (sd) : 10.6 (28.3)
min < med < max:
0 < 0 < 100
IQR (CV) : 0 (2.7)
11 distinct values 0
(0.0%)
sa_curso_titulacion
[numeric]
Mean (sd) : 4 (0.3)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
22 distinct values 0
(0.0%)
sa_titulacion_R
[numeric]
Min : 0
Mean : 0.1
Max : 1
0 : 16591 (90.2%)
1 : 1808 ( 9.8%)
0
(0.0%)
sa_titulacion_participacion
[numeric]
Mean (sd) : 9.9 (29.8)
min < med < max:
0 < 0 < 100
IQR (CV) : 0 (3)
0.00 : 16574 (90.1%)
33.33 : 1 ( 0.0%)
50.00 : 15 ( 0.1%)
66.67 : 1 ( 0.0%)
100.00 : 1808 ( 9.8%)
0
(0.0%)
sa_titulacion_implicacion
[numeric]
Mean (sd) : 5 (0.1)
min < med < max:
1 < 5 < 5
IQR (CV) : 0 (0)
1.00 : 2 ( 0.0%)
2.00 : 4 ( 0.0%)
3.00 : 22 ( 0.1%)
4.00 : 157 ( 0.9%)
4.50 : 1 ( 0.0%)
5.00 : 18213 (99.0%)
0
(0.0%)
il_R
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 18351 (99.7%)
1 : 48 ( 0.3%)
0
(0.0%)
il_participacion
[numeric]
Min : 0
Mean : 0.3
Max : 100
0 : 18351 (99.7%)
100 : 48 ( 0.3%)
0
(0.0%)
il_consecuencia_estudios
[numeric]
1 distinct value 0 : 18399 (100.0%) 0
(0.0%)
il_motivo_estudios
[numeric]
1 distinct value 0 : 18399 (100.0%) 0
(0.0%)
il_trabajo_actual
[numeric]
1 distinct value 0 : 18399 (100.0%) 0
(0.0%)
il_trabajo_actual_relacionado_estudios
[numeric]
1 distinct value 0 : 18399 (100.0%) 0
(0.0%)
cluster
[factor]
1. 1
2. 2
3. 3
4. 4
0 ( 0.0%)
18399 (100.0%)
0 ( 0.0%)
0 ( 0.0%)
0
(0.0%)

2.4.4.2 Clasificación del perfil 3 del estudiantado: Motivated (8.76%): Egresado especialista, con sentido de pertenencia a la universidad (alta implicación en la mejora) y alta satisfacción.

El 8.76% del estudiantado analizado pertenece a esta categoría. Se caracteriza por:

  • egresar en 1.07 especialidad/es en una media de 2.13 años;

  • con tasas de rendimiento (eficiencia y evaluación) al 98%;

  • superar, frente a los ECTS requeridos para obtener la titulación, una media del 102.45% (se superan más ECTS de los requeridos, pudiendo obtener distintas especialidades o superar asignaturas optativas adicionales) y reconocer un 9.27% de los requeridos;

  • obtener una nota media de 8.03;

  • participación en las encuestas del (asignaturas (37.28%), curso (34.73%), 99.96% en inserción laboral y 61.66% en titulación) y satisfacción media en asignaturas manifestada de 4.22.

A continuación se muestra el detalle la información descriptiva del perfil del estudiantado, incluyendo gráficos para cada variable, las frecuencias para cada valor y las etiquetas de las variables.

# se visualiza 
dfSummary(perfil_3, 
          plain.ascii  = FALSE,
          style        = 'grid',
          graph.magnif = 0.85,
          varnumbers = FALSE,
          valid.col    = FALSE,
          tmp.img.dir  = "/tmp")

2.4.5 Data Frame Summary

2.4.5.1 perfil_3

Dimensions: 2706 x 34
Duplicates: 117

Variable Stats / Values Freqs (% of Valid) Graph Missing
ste_codalf
[numeric]
Min : 0
Mean : 0.8
Max : 1
0 : 522 (19.3%)
1 : 2184 (80.7%)
0
(0.0%)
acceso
[numeric]
Min : 0
Mean : 0.9
Max : 1
0 : 348 (12.9%)
1 : 2358 (87.1%)
0
(0.0%)
t_sup_req
[numeric]
Mean (sd) : 102.5 (6.6)
min < med < max:
100 < 100 < 151.7
IQR (CV) : 0 (0.1)
23 distinct values 0
(0.0%)
t_rec
[numeric]
Mean (sd) : 9.3 (16.3)
min < med < max:
0 < 0 < 92.5
IQR (CV) : 10 (1.8)
100 distinct values 0
(0.0%)
nota_media
[numeric]
Mean (sd) : 8 (0.7)
min < med < max:
5.8 < 8.1 < 9.7
IQR (CV) : 1 (0.1)
1885 distinct values 0
(0.0%)
tasa_abandono
[numeric]
1 distinct value 0 : 2706 (100.0%) 0
(0.0%)
titulado
[numeric]
Min : 1
Mean : 1
Max : 2
1 : 2691 (99.4%)
2 : 15 ( 0.6%)
0
(0.0%)
n_nodos_fin_titulacion
[numeric]
Mean (sd) : 1.1 (0.3)
min < med < max:
1 < 1 < 4
IQR (CV) : 0 (0.3)
1 : 2555 (94.4%)
2 : 121 ( 4.5%)
3 : 26 ( 1.0%)
4 : 4 ( 0.1%)
0
(0.0%)
duracion_media_estudios
[numeric]
Mean (sd) : 2.1 (1.5)
min < med < max:
1 < 2 < 10
IQR (CV) : 1 (0.7)
1 : 1079 (39.9%)
2 : 1057 (39.1%)
3 : 192 ( 7.1%)
4 : 148 ( 5.5%)
5 : 91 ( 3.4%)
6 : 68 ( 2.5%)
7 : 40 ( 1.5%)
8 : 19 ( 0.7%)
9 : 11 ( 0.4%)
10 : 1 ( 0.0%)
0
(0.0%)
tasa_eficiencia
[numeric]
Mean (sd) : 97.1 (7.2)
min < med < max:
36.6 < 100 < 100
IQR (CV) : 0 (0.1)
192 distinct values 0
(0.0%)
t_exito
[numeric]
Mean (sd) : 99 (3.7)
min < med < max:
68 < 100 < 100
IQR (CV) : 0 (0)
113 distinct values 0
(0.0%)
t_evaluacion
[numeric]
Mean (sd) : 98.1 (5.6)
min < med < max:
38 < 100 < 100
IQR (CV) : 0 (0.1)
172 distinct values 0
(0.0%)
edad_inicio
[numeric]
Mean (sd) : 31.1 (8.4)
min < med < max:
17 < 29 < 68
IQR (CV) : 11 (0.3)
47 distinct values 0
(0.0%)
sa_asig_R
[numeric]
Min : 0
Mean : 0.3
Max : 1
0 : 1962 (72.5%)
1 : 744 (27.5%)
0
(0.0%)
sa_asig_participacion
[numeric]
Mean (sd) : 37.3 (40.6)
min < med < max:
0 < 21.2 < 100
IQR (CV) : 80 (1.1)
283 distinct values 0
(0.0%)
sa_asig_actividades
[numeric]
Mean (sd) : 4.2 (0.5)
min < med < max:
1 < 4.3 < 5
IQR (CV) : 0.2 (0.1)
172 distinct values 0
(0.0%)
sa_asig_organizacion
[numeric]
Mean (sd) : 4.3 (0.5)
min < med < max:
1 < 4.3 < 5
IQR (CV) : 0 (0.1)
151 distinct values 0
(0.0%)
sa_asig_manual
[numeric]
Mean (sd) : 4 (0.6)
min < med < max:
1 < 4 < 5
IQR (CV) : 0.2 (0.1)
197 distinct values 0
(0.0%)
sa_asig_materiales
[numeric]
Mean (sd) : 4.2 (0.5)
min < med < max:
1 < 4.2 < 5
IQR (CV) : 0 (0.1)
155 distinct values 0
(0.0%)
sa_asig_docente
[numeric]
Mean (sd) : 4.4 (0.5)
min < med < max:
1 < 4.4 < 5
IQR (CV) : 0.2 (0.1)
173 distinct values 0
(0.0%)
sa_asig_aprendiendo
[numeric]
Mean (sd) : 85.3 (18.6)
min < med < max:
3.7 < 90.9 < 100
IQR (CV) : 0 (0.2)
139 distinct values 0
(0.0%)
sa_curso_R
[numeric]
Min : 0
Mean : 0.3
Max : 1
0 : 1978 (73.1%)
1 : 728 (26.9%)
0
(0.0%)
sa_curso_participacion
[numeric]
Mean (sd) : 34.7 (43.4)
min < med < max:
0 < 0 < 100
IQR (CV) : 100 (1.3)
0.00 : 1549 (57.2%)
20.00 : 1 ( 0.0%)
25.00 : 18 ( 0.7%)
33.33 : 48 ( 1.8%)
50.00 : 306 (11.3%)
66.67 : 46 ( 1.7%)
75.00 : 10 ( 0.4%)
100.00 : 728 (26.9%)
0
(0.0%)
sa_curso_titulacion
[numeric]
Mean (sd) : 4 (0.6)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.2)
17 distinct values 0
(0.0%)
sa_titulacion_R
[numeric]
Min : 0
Mean : 0.6
Max : 1
0 : 1038 (38.4%)
1 : 1668 (61.6%)
0
(0.0%)
sa_titulacion_participacion
[numeric]
Mean (sd) : 61.7 (48.6)
min < med < max:
0 < 100 < 100
IQR (CV) : 100 (0.8)
0 : 1037 (38.3%)
50 : 1 ( 0.0%)
100 : 1668 (61.6%)
0
(0.0%)
sa_titulacion_implicacion
[numeric]
Mean (sd) : 4.8 (0.5)
min < med < max:
1 < 5 < 5
IQR (CV) : 0 (0.1)
1.00 : 6 ( 0.2%)
2.00 : 7 ( 0.3%)
3.00 : 74 ( 2.7%)
4.00 : 395 (14.6%)
4.50 : 1 ( 0.0%)
5.00 : 2223 (82.2%)
0
(0.0%)
il_R
[numeric]
Min : 0
Mean : 1
Max : 1
0 : 1 ( 0.0%)
1 : 2705 (100.0%)
0
(0.0%)
il_participacion
[numeric]
Min : 0
Mean : 100
Max : 100
0 : 1 ( 0.0%)
100 : 2705 (100.0%)
0
(0.0%)
il_consecuencia_estudios
[numeric]
Min : 0
Mean : 0.6
Max : 1
0 : 1149 (42.5%)
1 : 1557 (57.5%)
0
(0.0%)
il_motivo_estudios
[numeric]
Min : 0
Mean : 0.7
Max : 1
0 : 879 (32.5%)
1 : 1827 (67.5%)
0
(0.0%)
il_trabajo_actual
[numeric]
Min : 0
Mean : 0.9
Max : 1
0 : 330 (12.2%)
1 : 2376 (87.8%)
0
(0.0%)
il_trabajo_actual_relacionado_estudios
[numeric]
Min : 0
Mean : 0.6
Max : 1
0 : 1079 (39.9%)
1 : 1627 (60.1%)
0
(0.0%)
cluster
[factor]
1. 1
2. 2
3. 3
4. 4
0 ( 0.0%)
0 ( 0.0%)
2706 (100.0%)
0 ( 0.0%)
0
(0.0%)

2.4.5.2 Clasificación del perfil 4 del estudiantado: Dissatisfied (6.55%): Egresado con satisfacción inferior a la media.

El 6.55% del estudiantado analizado pertenece a esta categoría. Se caracteriza por:

  • abandonar los estudios en 2.19 años de media;

  • con tasas de rendimiento (eficiencia y evaluación) inferiores al 96%;

  • superar, frente a los ECTS requeridos para obtener la titulación, una media del 94.53% (se superan más ECTS de los requeridos, pudiendo obtener distintas especialidades o superar asignaturas optativas adicionales) y reconocer un 11.15% de los requeridos;

  • obtener una nota media de 7.97;

  • participación baja en las encuestas (asignaturas (62.03%), curso (42.12%), 3.41% en inserción laboral y 20.81% en titulación) y satisfacción media en asignaturas manifestada de 3.2.

A continuación se muestra el detalle la información descriptiva del perfil del estudiantado, incluyendo gráficos para cada variable, las frecuencias para cada valor y las etiquetas de las variables.

# se visualiza 
dfSummary(perfil_4, 
          plain.ascii  = FALSE,
          style        = 'grid',
          graph.magnif = 0.85,
          varnumbers = FALSE,
          valid.col    = FALSE,
          tmp.img.dir  = "/tmp")

2.4.6 Data Frame Summary

2.4.6.1 perfil_4

Dimensions: 2023 x 34
Duplicates: 45

Variable Stats / Values Freqs (% of Valid) Graph Missing
ste_codalf
[numeric]
Min : 0
Mean : 0.7
Max : 1
0 : 610 (30.2%)
1 : 1413 (69.8%)
0
(0.0%)
acceso
[numeric]
Min : 0
Mean : 0.8
Max : 1
0 : 359 (17.7%)
1 : 1664 (82.3%)
0
(0.0%)
t_sup_req
[numeric]
Mean (sd) : 94.5 (23)
min < med < max:
0 < 100 < 150
IQR (CV) : 0 (0.2)
68 distinct values 0
(0.0%)
t_rec
[numeric]
Mean (sd) : 11.2 (19.3)
min < med < max:
0 < 0 < 92.5
IQR (CV) : 10 (1.7)
92 distinct values 0
(0.0%)
nota_media
[numeric]
Mean (sd) : 8 (0.8)
min < med < max:
5.3 < 8 < 10
IQR (CV) : 1.1 (0.1)
1411 distinct values 0
(0.0%)
tasa_abandono
[numeric]
Min : 0
Mean : 0.1
Max : 1
0 : 1796 (88.8%)
1 : 227 (11.2%)
0
(0.0%)
titulado
[numeric]
Mean (sd) : 0.9 (0.3)
min < med < max:
0 < 1 < 2
IQR (CV) : 0 (0.4)
0 : 227 (11.2%)
1 : 1777 (87.8%)
2 : 19 ( 0.9%)
0
(0.0%)
n_nodos_fin_titulacion
[numeric]
Mean (sd) : 1 (0.5)
min < med < max:
0 < 1 < 4
IQR (CV) : 0 (0.5)
0 : 227 (11.2%)
1 : 1657 (81.9%)
2 : 116 ( 5.7%)
3 : 20 ( 1.0%)
4 : 3 ( 0.1%)
0
(0.0%)
duracion_media_estudios
[numeric]
Mean (sd) : 2.2 (1.6)
min < med < max:
1 < 2 < 10
IQR (CV) : 1 (0.7)
1 : 851 (42.1%)
2 : 697 (34.5%)
3 : 145 ( 7.2%)
4 : 112 ( 5.5%)
5 : 102 ( 5.0%)
6 : 63 ( 3.1%)
7 : 30 ( 1.5%)
8 : 15 ( 0.7%)
9 : 4 ( 0.2%)
10 : 4 ( 0.2%)
0
(0.0%)
tasa_eficiencia
[numeric]
Mean (sd) : 94 (15.9)
min < med < max:
0 < 100 < 100
IQR (CV) : 0 (0.2)
200 distinct values 0
(0.0%)
t_exito
[numeric]
Mean (sd) : 97.1 (11.8)
min < med < max:
0 < 100 < 100
IQR (CV) : 0 (0.1)
114 distinct values 0
(0.0%)
t_evaluacion
[numeric]
Mean (sd) : 95.9 (12.6)
min < med < max:
0 < 100 < 100
IQR (CV) : 0 (0.1)
166 distinct values 0
(0.0%)
edad_inicio
[numeric]
Mean (sd) : 31.3 (8)
min < med < max:
17 < 29 < 69
IQR (CV) : 11 (0.3)
46 distinct values 0
(0.0%)
sa_asig_R
[numeric]
Min : 0
Mean : 0.4
Max : 1
0 : 1144 (56.5%)
1 : 879 (43.5%)
0
(0.0%)
sa_asig_participacion
[numeric]
Mean (sd) : 62 (33.4)
min < med < max:
1.8 < 64.7 < 100
IQR (CV) : 70.6 (0.5)
281 distinct values 0
(0.0%)
sa_asig_actividades
[numeric]
Mean (sd) : 3.1 (0.8)
min < med < max:
1 < 3.3 < 5
IQR (CV) : 0.9 (0.3)
201 distinct values 0
(0.0%)
sa_asig_organizacion
[numeric]
Mean (sd) : 3.4 (0.8)
min < med < max:
1 < 3.5 < 5
IQR (CV) : 1 (0.2)
172 distinct values 0
(0.0%)
sa_asig_manual
[numeric]
Mean (sd) : 3 (0.8)
min < med < max:
1 < 3.1 < 5
IQR (CV) : 1 (0.3)
192 distinct values 0
(0.0%)
sa_asig_materiales
[numeric]
Mean (sd) : 3.2 (0.8)
min < med < max:
1 < 3.3 < 5
IQR (CV) : 1 (0.3)
174 distinct values 0
(0.0%)
sa_asig_docente
[numeric]
Mean (sd) : 3.3 (0.9)
min < med < max:
1 < 3.4 < 5
IQR (CV) : 0.9 (0.3)
205 distinct values 0
(0.0%)
sa_asig_aprendiendo
[numeric]
Mean (sd) : 72.3 (26.5)
min < med < max:
2.9 < 90.9 < 100
IQR (CV) : 40.9 (0.4)
149 distinct values 0
(0.0%)
sa_curso_R
[numeric]
Min : 0
Mean : 0.3
Max : 1
0 : 1345 (66.5%)
1 : 678 (33.5%)
0
(0.0%)
sa_curso_participacion
[numeric]
Mean (sd) : 42.1 (45)
min < med < max:
0 < 25 < 100
IQR (CV) : 100 (1.1)
11 distinct values 0
(0.0%)
sa_curso_titulacion
[numeric]
Mean (sd) : 3.6 (0.9)
min < med < max:
1 < 4 < 5
IQR (CV) : 1 (0.3)
23 distinct values 0
(0.0%)
sa_titulacion_R
[numeric]
Min : 0
Mean : 0.2
Max : 1
0 : 1606 (79.4%)
1 : 417 (20.6%)
0
(0.0%)
sa_titulacion_participacion
[numeric]
Mean (sd) : 20.8 (40.5)
min < med < max:
0 < 0 < 100
IQR (CV) : 0 (1.9)
0 : 1598 (79.0%)
50 : 8 ( 0.4%)
100 : 417 (20.6%)
0
(0.0%)
sa_titulacion_implicacion
[numeric]
Mean (sd) : 4.9 (0.3)
min < med < max:
2 < 5 < 5
IQR (CV) : 0 (0.1)
2 : 1 ( 0.0%)
3 : 20 ( 1.0%)
4 : 88 ( 4.3%)
5 : 1914 (94.6%)
0
(0.0%)
il_R
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 1954 (96.6%)
1 : 69 ( 3.4%)
0
(0.0%)
il_participacion
[numeric]
Min : 0
Mean : 3.4
Max : 100
0 : 1954 (96.6%)
100 : 69 ( 3.4%)
0
(0.0%)
il_consecuencia_estudios
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 2013 (99.5%)
1 : 10 ( 0.5%)
0
(0.0%)
il_motivo_estudios
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 1990 (98.4%)
1 : 33 ( 1.6%)
0
(0.0%)
il_trabajo_actual
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 1989 (98.3%)
1 : 34 ( 1.7%)
0
(0.0%)
il_trabajo_actual_relacionado_estudios
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 2016 (99.7%)
1 : 7 ( 0.3%)
0
(0.0%)
cluster
[factor]
1. 1
2. 2
3. 3
4. 4
0 ( 0.0%)
0 ( 0.0%)
0 ( 0.0%)
2023 (100.0%)
0
(0.0%)

Se crea una nueva variable que etiqueta a los perfiles del estudiantado. Se muestra la distribución de etiquetas y su correspondencia con el cluster:

# se crea nueva variable
rto_fin_abandono_clas$etiqueta = ifelse(rto_fin_abandono_clas$cluster == 1,
                                        "dropout",
                                        ifelse(rto_fin_abandono_clas$cluster == 2,
                                               "common_graduate",
                                               ifelse(rto_fin_abandono_clas$cluster == 3,
                                                      "motivated",
                                                      "dissatisfied")))


# se muestra la distribución de etiquetas y su correspondencia
dis_etiqueta_cluster = rto_fin_abandono_clas %>% group_by(etiqueta) %>% count()

datatable(dis_etiqueta_cluster)

2.4.7 Objetivo específico 3: Predecir la clasificación de los estudiantes que no han finalizado los estudios.

Se pretende predecir qué tipo de perfil (4 clusters recién definidos) tiene cada estudiante que se encuentra en progreso (no ha finalizado ni abandonado sus estudios).

Actualmente se cuenta con 7989 estudiantes en progreso. El principal interés es identificar sus características para poder realizar un seguimiento adecuado, principalmente, de los que se encuentran en riesgo de abandono.

Para llevarlo a cabo se aplicarán técnicas de aprendizaje supervisado y se utilizará el algoritmo de clasificación que aporte mejores resultados. Para determinar el mejor modelo se va a aplicar validación cruzada sobre los datos de entrada, optando por el que mayor calidad de predicción aporte.

Los métodos de clasificación tienden al sobre entrenamiento u overfitting, para evitarlo, se aplicará 10-Fold-Cross-Validation, que consiste en:

  • parte de los datos originales y los divide en conjunto de entrenamiento, de test y de validación;
  • el conjunto de entrenamiento se divide en 10 subconjuntos y, al entrenar, los 10 subconjuntos se utilizan como test del modelo y el resto de los datos como entrenamiento;
  • el proceso se repite 10 veces, y en cada una se aplica un subconjunto de prueba diferente;
  • finalizadas las 10 iteraciones, se obtiene la precisión y el error para cada uno de los modelos producidos (promedio de los 10 modelos entrenados),
  • el proceso se repite para el resto de modelos de clasificación que se evalúan;
  • se selecciona el que tenga mayor precisión y menor error promedio.

Se aplica el proceso y se eliminan las variables con valor único (predictores de varianza cero), que son:

# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

# se recupera la etiqueta
rto_fin_abandono_red$cluster = y_cluster4

# se eliminan variables con valor único (predictores de varianza cero)
nzv = nearZeroVar(rto_fin_abandono_red[, -ncol(rto_fin_abandono_red)])
rto_fin_abandono_pred = rto_fin_abandono_red[,-nzv]

# se eliminan las variables con valor único (predictores de varianza cero)
names(rto_fin_abandono_red[, nzv])
## [1] "sa_curso_titulacion"       "sa_titulacion_implicacion"
# con ayuda de la library(caTools) se obtienen muestras proporcionadas por el tipo de clasificación
# se crea un vector de particion sobre la variable cluster
# el tamaño de muestra será de 80%
trainIndex = sample.split(y_cluster4, SplitRatio = 0.8)
# se definen las variables a utilizar en la clasificación
rto_fin_abandono_train = rto_fin_abandono_pred[trainIndex == TRUE, ]
rto_fin_abandono_test = rto_fin_abandono_pred[trainIndex == FALSE, ]
y_train = y_cluster4[trainIndex == TRUE]
y_test = y_cluster4[trainIndex == FALSE]


# Para aplicar la Validación Cruzada vamos a hacer uso de la función trainControl del paquete caret, y luego entrenaremos cada modelo sobre k = 10 subconjuntos:
trControl = trainControl(method  = "cv",
                         number  = 10)

2.4.7.1 Algoritmo k-NN.

El algoritmo k-NN mide distancias entre conjuntos de datos para identificar patrones sin un aprendizaje específico.

El procedimiento consiste en:

  • a partir de un conjunto de datos de entrenamiento (con datos estandarizados y sin valores ausentes) se deducirá el criterio de clasificación de los datos,
  • que podrá aplicarse al conjunto de test para evaluar la calidad de la clasificación.
  • Cuando se apliquen los parámetros idóneos para una calidad suficiente,
  • se podrá aplicar el algoritmo al juego de datos a predecir.

Para aplicarlo se hará uso de la función train del paquete caret, aplicando el método ‘knn’ y 10-Fold-Cross-Validation. . Limitaciones del algoritmo:

  • alta carga computacional;
  • no es apropiado si existen muchos grados de libertad.
# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

# k-NN
validacion_knn = train(cluster ~ ., 
                       method     = "knn",
                       tuneGrid   = expand.grid(k = seq(3, 15, 2)), # valores impares de k para evitar empate
                       trControl  = trControl,
                       metric     = "Accuracy",
                       data       = rto_fin_abandono_train)
# resultado
validacion_knn
## k-Nearest Neighbors 
## 
## 24700 samples
##    31 predictor
##     4 classes: '1', '2', '3', '4' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 22230, 22232, 22230, 22230, 22229, 22230, ... 
## Resampling results across tuning parameters:
## 
##   k   Accuracy   Kappa    
##    3  0.9849801  0.9735678
##    5  0.9855469  0.9745442
##    7  0.9846967  0.9730296
##    9  0.9840894  0.9719335
##   11  0.9837657  0.9713629
##   13  0.9833610  0.9706536
##   15  0.9832798  0.9705168
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 5.
# grafico (max k)
plot(validacion_knn)

2.4.7.2 Algoritmo bosque aleatorio de decisión (Random Forest).

Un bosque aleatorio de decisión (Random forest) consiste en aplicar de manera iterativa el algoritmo de árboles de decisión con diferentes parámetros sobre los mismos datos siendo uno de los métodos más eficientes de predicción por aplicar el promedio de muchos modelos reduciendo la variabilidad final del conjunto.

Esta iteración crea modelos más robustos de los que se obtendrían creando un solo árbol de decisión.

Para aplicarlo se hará uso de la función train del paquete caret, aplicando el método ‘rf’ y 10-Fold-Cross-Validation.

# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

# Random Forest
validacion_rf = train(cluster ~ ., 
                      method     = "rf", 
                      trControl  = trControl,
                      metric     = "Accuracy",
                      data       = rto_fin_abandono_train)

# resultado
validacion_rf
## Random Forest 
## 
## 24700 samples
##    31 predictor
##     4 classes: '1', '2', '3', '4' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 22230, 22232, 22230, 22230, 22229, 22230, ... 
## Resampling results across tuning parameters:
## 
##   mtry  Accuracy   Kappa    
##    2    0.9787860  0.9627071
##   16    0.9879354  0.9788098
##   31    0.9864779  0.9762633
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was mtry = 16.

2.4.7.3 Justificación del algoritmo a aplicar.

Para optimizar los resultados a obtener, se comprueba la exactitud o accuracy para diferentes algoritmos. A mayor exactitud o accuracy, mayor calidad:

# en cada tipo de validación se identifica el algortimo
validacion_knn$results[, 'Algoritmo'] = 'k-NN'
validacion_rf$results[, 'Algoritmo'] = 'Random Forest'


# la métrica se renombra y se elimina (para poder unir)
validacion_knn$results[, 'Valor'] = validacion_knn$results[, 'k']
validacion_knn$results[, 'Métrica'] = 'k'
validacion_knn$results[, 'k'] = NULL

validacion_rf$results[, 'Valor'] = validacion_rf$results[, 'mtry']
validacion_rf$results[, 'Métrica'] = 'mtry'
validacion_rf$results[, 'mtry'] = NULL


# se comparan resultados
validacion = rbind(validacion_knn$results, 
                   validacion_rf$results)

# se muestran
datatable(validacion)

Se obtiene que:

  • el algoritmo Random Forest es el que mejor resultados aporta.
# se filtran los resultados con mejor accuracy
validacion_max = validacion %>%
  arrange(Accuracy)


# se muestran
datatable(validacion_max[nrow(validacion_max),])

2.4.7.4 Aplicación del algoritmo y obtención de resultados.

Conocido el algoritmo con óptimos resultados, se aplica al juego de datos de 7989 de entrenamiento estudiantes en progreso (no han finalizado ni abandonado sus estudios) para predecir su categoría.

El principal interés es identificar sus características para poder realizar un seguimiento adecuado, principalmente, de los que se encuentran en riesgo de abandono.

Para aplicarlo se hará uso de la función randomForest del paquete randomForest.

Se muestra la evolución de árboles del modelo a partir del conjunto de entrenamiento:

# se elimina variable a predecir
rto_fin_abandono_train$cluster = NULL

# se entrena
rf_segment = randomForest(y_train ~ ., 
                          data = rto_fin_abandono_train,
                          ntree = 100,    # numero de árboles en el bosque
                          mtry = validacion_max[nrow(validacion_max),'Valor'] # máximo de variables en modelos 
                          ) 

# se muestra la  evolución de árboles del modelo
rf_segment
## 
## Call:
##  randomForest(formula = y_train ~ ., data = rto_fin_abandono_train,      ntree = 100, mtry = validacion_max[nrow(validacion_max),          "Valor"]) 
##                Type of random forest: classification
##                      Number of trees: 100
## No. of variables tried at each split: 16
## 
##         OOB estimate of  error rate: 1.19%
## Confusion matrix:
##      1     2    3    4 class.error
## 1 6177     8    0   13 0.003388190
## 2   28 14617    4   70 0.006929819
## 3    0     3 2159    3 0.002771363
## 4   34   112   18 1454 0.101359703
plot(rf_segment) 

# se guarda
# saveRDS(rf_segment,'model_rf.rds')

# si es necesario, se carga
# rf_segment = readRDS('model_rf.rds')

Se revisa la importancia de las 10 variables del modelo para comprobar que no exista una alta correlación con la variable a predecir:

# importancia de variables del modelo
varImpPlot(rf_segment, sort = T, main = "Variable Importance Plot", n.var = 10)

Se realiza la predicción sobre el conjunto de test y se obtiene la bondad de su ajuste:

# https://www.rdocumentation.org/packages/randomForest/versions/4.7-1.1/topics/predict.randomForest

# se elimina variable a predecir
rto_fin_abandono_test$cluster = NULL

# Se realiza la predicción sobre el test
pred_rf = predict(rf_segment, rto_fin_abandono_test)
table(observed = y_test, predicted = pred_rf)
##         predicted
## observed    1    2    3    4
##        1 1545    2    0    2
##        2    4 3661    0   15
##        3    0    4  533    4
##        4   10   36   13  346
# bondad de la prediccion
aciertos_rf = mean(pred_rf == y_test) 

# se muestra
aciertos_rf
## [1] 0.9854251

Se realiza la predicción sobre el grupo a predecir (conjunto de datos con estudiantes en progreso):

# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

# se crea bbdd reducida con clasificación y valores orifinales
rto_progreso_pred = rto_progreso %>%
  select(variables_svd)


# se realiza la predicción sobre el grupo a predecir
rto_progreso_pred$pred_rf = predict(rf_segment, rto_progreso_red)

# se crea nueva variable
rto_progreso_pred$etiqueta = ifelse(rto_progreso_pred$pred_rf == 1,
                                    "dropout",
                                    ifelse(rto_progreso_pred$pred_rf == 2,
                                           "common_graduate",
                                           ifelse(rto_progreso_pred$pred_rf == 3,
                                                  "motivated",
                                                  "dissatisfied")))

# se muestra la distribución de etiquetas y su correspondencia con el cluster
dis_etiqueta_cluster2 = rto_progreso_pred %>% group_by(pred_rf) %>% count()

datatable(dis_etiqueta_cluster2)
# se obtienen las distintas bases de datos asociadas a cada perfil
perfil_1_pre = rto_progreso_pred %>% filter(etiqueta == "dropout")
perfil_2_pre = rto_progreso_pred %>% filter(etiqueta == "common_graduate")
perfil_3_pre = rto_progreso_pred %>% filter(etiqueta == "motivated")
perfil_4_pre = rto_progreso_pred %>% filter(etiqueta == "dissatisfied")
2.4.7.4.1 Comparación y justificación de resultados: clasificación vs. predicción.

Se compara los resultados de cada categoría en el juego de datos original y en el de predicción obteniendo lo siguientes resultados, con especial atención en la proporción y las variables relacionadas con el egreso/abandono:

# se define función para tener mostrar comparación de resultados
comparacion_item = function(x){
  resultados = c(paste0('Mean (sd): ',
                        round(mean(perfil_1[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_1[[x]], na.rm=TRUE), 1),')'), # motivated_clas
                 paste0('Mean (sd): ',
                        round(mean(perfil_1_pre[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_1_pre[[x]], na.rm=TRUE), 1),')'), # motivated_pred
                 paste0('Mean (sd): ',
                        round(mean(perfil_2[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_2[[x]], na.rm=TRUE), 1),')'), # dissatisfied_clas
                 paste0('Mean (sd): ',
                        round(mean(perfil_2_pre[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_2_pre[[x]], na.rm=TRUE), 1),')'), # dissatisfied_pred
                 paste0('Mean (sd): ',
                        round(mean(perfil_3[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_3[[x]], na.rm=TRUE), 1),')'), # motivated_clas
                 paste0('Mean (sd): ',
                        round(mean(perfil_3_pre[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_3_pre[[x]], na.rm=TRUE), 1),')'), # motivated_pred
                 paste0('Mean (sd): ',
                        round(mean(perfil_4[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_4[[x]], na.rm=TRUE), 1),')'), # dropout_clas
                 paste0('Mean (sd): ',
                        round(mean(perfil_4_pre[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_4_pre[[x]], na.rm=TRUE), 1),')') # dropout_pred
               )
  
  return(resultados)
}

# Comparación clasificación-predicción
comparacion = data.frame(
  perfil = c('dropout',
             'dropout',
             'common_graduate',
             'common_graduate',
             'motivated',
             'motivated',
             'dissatisfied',
             'dissatisfied'),
    método = c('clasificación',
               'predicción',
               'clasificación',
               'predicción',
               'clasificación',
               'predicción',
               'clasificación',
               'predicción'
             ),
  "proporción" = c(paste0(nrow(perfil_1),
                          " (", round(100*nrow(perfil_1)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_1_pre),
                          " (", round(100*nrow(perfil_1_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_2),
                          " (", round(100*nrow(perfil_2)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_2_pre),
                          " (", round(100*nrow(perfil_2_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_3),
                          " (", round(100*nrow(perfil_3)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_3_pre),
                          " (", round(100*nrow(perfil_3_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_4),
                          " (", round(100*nrow(perfil_4)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_4_pre),
                          " (", round(100*nrow(perfil_4_pre)/nrow(rto_progreso), 2), "%)")
              ),
  'titulado' = comparacion_item('titulado'),
  'n_especialidades' = comparacion_item('n_nodos_fin_titulacion'),
  'tasa_eficiencia' = comparacion_item('tasa_eficiencia'),
  't_sup_req' = comparacion_item('t_sup_req'),
  'nota_media' = comparacion_item('nota_media')
)

comparacion_t = data.frame(t(comparacion[-1]))
# Añadimos los nombres de las columnas
colnames(comparacion_t) = comparacion[, 1]

# se muestran resultados
datatable(comparacion_t)

Como se ha podido comprobar en el gráfico de importancia de las variables del modelo Random Forest, las variables más importantes están relacionadas con el egreso de los estudiantes, mantenerlas en el modelo con el fin de predecir la clasificación de los estudiantes en progreso se considera una limitación, pues al estar en progreso, es lógico que sus resultados se vean condicionados y no sean comparables. Sus rendimientos son menores y no han finalizado los estudios, lo que motiva que estas variables condicionen al modelo y clasifique a la mayoría de estudiantes bajo la etiqueta dropout, cuando posiblemente no estén en riesgo de abandono. Si aplicamos este modelo a los estudiantes en progreso vemos como el mismo identifica al 10.5% en riesgo de abandono, lo que resulta llamativo y, posiblemente, no real. Las variables que informan o dependen del egreso/abandono del estudiante son: tasa_abandono, titulado, n_nodos_fin_titulacion, sa_titulacion_R, sa_titulacion_participacion, sa_titulacion_implicacion, il_R, il_participacion, il_consecuencia_estudios. Estas variables se eliminan para que no condicionen la predicción de la clasificación.

# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

# se recupera la etiqueta
rto_fin_abandono_red$cluster = y_cluster4

# se eliminan las variables relacionadas con el egreso/abandono
v_titulados = c('t_sup_req', 'tasa_abandono', 'titulado', 'n_nodos_fin_titulacion', 'duracion_media_estudios',
                'sa_titulacion_R', 'sa_titulacion_participacion', 'sa_titulacion_implicacion', 'il_R',
                'il_participacion', 'il_consecuencia_estudios', 'il_motivo_estudios', 'il_trabajo_actual',
                'il_trabajo_actual_relacionado_estudios')

rto_fin_abandono_pred = select(rto_fin_abandono_red,
                               -v_titulados)

# se eliminan las variables con valor único (predictores de varianza cero)
# names(rto_fin_abandono_red[, nzv])
  
# con ayuda de la library(caTools) se obtienen muestras proporcionadas por el tipo de clasificación
# se crea un vector de particion sobre la variable cluster
# el tamaño de muestra será de 80%
trainIndex = sample.split(y_cluster4, SplitRatio = 0.8)
# se definen las variables a utilizar en la clasificación
rto_fin_abandono_train = rto_fin_abandono_pred[trainIndex == TRUE, ]
rto_fin_abandono_test = rto_fin_abandono_pred[trainIndex == FALSE, ]
y_train = y_cluster4[trainIndex == TRUE]
y_test = y_cluster4[trainIndex == FALSE]


# Para aplicar la Validación Cruzada vamos a hacer uso de la función trainControl del paquete caret, y luego entrenaremos cada modelo sobre k = 10 subconjuntos haciendo uso de la función lapply:
trControl = trainControl(method  = "cv",
                          number  = 10)
2.4.7.4.1.1 Juego de datos reducido para la predicción del perfil de estudiantes: descripción de variables.

El juego de datos se reduce a las variables que dependen del progreso de los estudiantes, excluyendo las relativas al egreso/abandono:

Quedando compuesto de las siguientes variables:

names(rto_fin_abandono_pred)
##  [1] "ste_codalf"             "acceso"                 "t_rec"                 
##  [4] "nota_media"             "tasa_eficiencia"        "t_exito"               
##  [7] "t_evaluacion"           "edad_inicio"            "sa_asig_R"             
## [10] "sa_asig_participacion"  "sa_asig_actividades"    "sa_asig_organizacion"  
## [13] "sa_asig_manual"         "sa_asig_materiales"     "sa_asig_docente"       
## [16] "sa_asig_aprendiendo"    "sa_curso_R"             "sa_curso_participacion"
## [19] "sa_curso_titulacion"    "cluster"

Y recordando su definición:

Variable Descripción Valores Tipo Explotación
ste_codalf Tipo de estudios 0: Grado, 1: Máster Cardinal
acceso Tipo acceso presentado 1: Titulado Universitario, 0: No Cardinal
t_rec 100*ECTS reconocidos/total a superar >=0 Cardinal
nota_media Media ponderada ECTS superados en Udima >=0 Cardinal
tasa_eficiencia 100*ECTS superados/matriculados >=0 Cardinal
t_exito 100*ECTS superados/presentados >=0 Cardinal
t_evaluacion 100*ECTS presentados/matriculados >=0 Cardinal
sa_asig_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_asig_participacion Proporción de encuestas respondidas por el estudiante en las asignaturas del plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_asig_organizacion Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem La organización de la asignatura facilita el aprendizaje de esta asignatura. Escala 1-5 >=1 y <= 5 Cardinal
sa_asig_manual Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem El manual facilita el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_materiales Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem Otros materiales didácticos aportados facilitan el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_actividades Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem Las actividades didácticas planteadas facilitan el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_docente Promedio de valoraciones aportadas por el estudiante en las asignaturas para el ítem La labor del docente facilita el aprendizaje de esta asignatura >=1 y <= 5 Cardinal
sa_asig_aprendiendo Porcentaje de respuestas al ítem ¿Consideras que estás aprendiendo? respecto de las encuestas respondidas por el estudiante en las asignaturas entre 0 y 1 Cardinal
sa_curso_R Representatividad de la muestra 1: “Sí”, 0: “No” Cardinal
sa_curso_participacion Proporción de encuestas respondidas por el estudiante en los cursos matriculados en el plan respecto de las que han sido enviadas entre 0 y 1 Cardinal
sa_curso_titulacion Promedio de valoraciones aportadas por el estudiante en los cursos matriculados en el plan para el ítem ‘Grado de satisfacción general con la titulación’. Escala 1-5 >=1 y <= 5 Cardinal

Representatividad de la muestra (determina si la muestra es estadísticamente significativa): Dado que las respuestas recibidas responden a un muestreo se determina la obtención de muestra representativa mediante la fórmula:

\[Muestra\ representativa\ (n)\ = \frac{\frac{z^{2}\ p\ (1-p)\ }{e^{2}}}{1 + \frac{z^{2}\ p\ (1-p)\ }{e^{2} N\ }}\]

Siendo:

  • Nivel de confianza (NC) del 80%, lo que implica Z-score (z) de 1.282.

  • Proporción esperada (p): para maximizar el tamaño muestral será de 0.5 (50%).

  • Error muestral (e) del 10%.

  • Población (N): cantidad total de usuarios a los que se invita a participar en el estudio.

# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

# k-NN
validacion_knn = train(cluster ~ ., 
                       method     = "knn",
                       tuneGrid   = expand.grid(k = seq(3, 15, 2)), # valores impares de k para evitar empate
                       trControl  = trControl,
                       metric     = "Accuracy",
                       data       = rto_fin_abandono_train)
# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

# Random Forest
validacion_rf = train(cluster ~ ., 
                      method     = "rf", 
                      trControl  = trControl,
                      metric     = "Accuracy",
                      data       = rto_fin_abandono_train)
# en cada tipo de validación se identifica el algortimo
validacion_knn$results[, 'Algoritmo'] = 'k-NN'
validacion_rf$results[, 'Algoritmo'] = 'Random Forest'


# la métrica se renombra y se elimina (para poder unir)
validacion_knn$results[, 'Valor'] = validacion_knn$results[, 'k']
validacion_knn$results[, 'Métrica'] = 'k'
validacion_knn$results[, 'k'] = NULL

validacion_rf$results[, 'Valor'] = validacion_rf$results[, 'mtry']
validacion_rf$results[, 'Métrica'] = 'mtry'
validacion_rf$results[, 'mtry'] = NULL


# se comparan resultados
validacion = rbind(validacion_knn$results, 
                   validacion_rf$results)

# se filtran los resultados con mejor accuracy
validacion_max = validacion %>%
  arrange(Accuracy)

# se exportan resultados a latex
# print(xtable(validacion), include.rownames = TRUE)
# se elimina variable a predecir
rto_fin_abandono_train$cluster = NULL

# se entrena
rf_segment = randomForest(y_train ~ ., 
                          data = rto_fin_abandono_train,
                          ntree = 100,    # numero de árboles en el bosque
                          mtry = validacion_max[nrow(validacion_max),'Valor'] # máximo de variables en modelos 
                          ) 
# se elimina variable a predecir
rto_fin_abandono_test$cluster = NULL

# Se realiza la predicción sobre el test
pred_rf = predict(rf_segment, rto_fin_abandono_test)

# bondad de la prediccion
aciertos_rf = mean(pred_rf == y_test) 
# se define set.seed(n) para forzar a que los valores de la muestra aleatoria sean los mismos siempre
set.seed(1234)

rto_progreso_pred = rto_progreso

# se realiza la predicción sobre el grupo a predecir
rto_progreso_pred$pred_rf = predict(rf_segment, rto_progreso_red)

# se crea nueva variable
rto_progreso_pred$etiqueta = ifelse(rto_progreso_pred$pred_rf == 1,
                                    "dropout",
                                    ifelse(rto_progreso_pred$pred_rf == 2,
                                           "common_graduate",
                                           ifelse(rto_progreso_pred$pred_rf == 3,
                                                  "motivated",
                                                  "dissatisfied")))

# se muestra la distribución de etiquetas y su correspondencia con el cluster
dis_etiqueta_cluster2 = rto_progreso_pred %>% group_by(pred_rf) %>% count()


# se obtienen las distintas bases de datos asociadas a cada perfil
perfil_1_pre = rto_progreso_pred %>% filter(etiqueta == "dropout")
perfil_2_pre = rto_progreso_pred %>% filter(etiqueta == "common_graduate")
perfil_3_pre = rto_progreso_pred %>% filter(etiqueta == "motivated")
perfil_4_pre = rto_progreso_pred %>% filter(etiqueta == "dissatisfied")

Por dicho motivo, se va a realizar de nuevo el proceso de clasificación y predicción eliminando del juego de datos las variables relacionadas con el egreso/abandono, para que no condicione tanto la predicción de la clasificación de estudiantes en progreso. Realizando dicho cambio, el nuevo modelo predice que el 59.59% del estudiantado en progreso se encuentra en riesgo de abandono, lo que se considera más adecuado (reduciendo la accuracy o exactitud de la aplicación del modelo al conjunto de test al 86.45%).

A continuación se muestran los resultados resumidos de dicho proceso:

Validación k-NN:

# k-NN

# resultado
validacion_knn
## k-Nearest Neighbors 
## 
## 24700 samples
##    19 predictor
##     4 classes: '1', '2', '3', '4' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 22230, 22232, 22230, 22230, 22229, 22230, ... 
## Resampling results across tuning parameters:
## 
##   Accuracy   Kappa      Algoritmo  Valor  Métrica
##   0.8189474  0.6672928  k-NN        3     k      
##   0.8307290  0.6842100  k-NN        5     k      
##   0.8358704  0.6909341  k-NN        7     k      
##   0.8385430  0.6946409  k-NN        9     k      
##   0.8402022  0.6964797  k-NN       11     k      
##   0.8411743  0.6979649  k-NN       13     k      
##   0.8412556  0.6975441  k-NN       15     k      
## 
## Tuning parameter 'k' was held constant at a value of 15
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 15.

Validación Random Forest:

# resultado
validacion_rf
## Random Forest 
## 
## 24700 samples
##    19 predictor
##     4 classes: '1', '2', '3', '4' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 22230, 22232, 22230, 22230, 22229, 22230, ... 
## Resampling results across tuning parameters:
## 
##   Accuracy   Kappa      Algoritmo      Valor  Métrica
##   0.8623083  0.7389186  Random Forest   2     mtry   
##   0.8690291  0.7557085  Random Forest  10     mtry   
##   0.8592721  0.7405882  Random Forest  19     mtry   
## 
## Tuning parameter 'mtry' was held constant at a value of 10
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was mtry = 10.

Valores óptimos:

# se muestran
datatable(validacion_max[nrow(validacion_max),])

Aplicación y resultados de Random Forest:

# se muestra la evolución de árboles del modelo
rf_segment
## 
## Call:
##  randomForest(formula = y_train ~ ., data = rto_fin_abandono_train,      ntree = 100, mtry = validacion_max[nrow(validacion_max),          "Valor"]) 
##                Type of random forest: classification
##                      Number of trees: 100
## No. of variables tried at each split: 10
## 
##         OOB estimate of  error rate: 13.35%
## Confusion matrix:
##      1     2   3    4 class.error
## 1 5645   510  14   29  0.08922233
## 2  333 14131 196   59  0.03994837
## 3   54  1598 215  298  0.90069284
## 4   29    97  80 1412  0.12731768
plot(rf_segment) 

Importancia de las variables del nuevo modelo:

# importancia de variables del modelo
varImpPlot(rf_segment, sort = T, main = "Variable Importance Plot", n.var = 10)

#confusion_test = 
table(observed = y_test, predicted = pred_rf)
##         predicted
## observed    1    2    3    4
##        1 1412  124    2   11
##        2  105 3523   38   14
##        3   12  407   49   73
##        4    6   30   15  354
# se exportan resultados a latex
# print(xtable(confusion_test), include.rownames = TRUE)

print(paste0('La bondad de la predicción del conjunto de test es del ', round(100*aciertos_rf, 2), '%.'))
## [1] "La bondad de la predicción del conjunto de test es del 86.45%."

El resumen comparativo de los resultados obtenidos:

# Comparación clasificación-predicción
comparacion = data.frame(
  perfil = c('dropout',
             'dropout',
             'common_graduate',
             'common_graduate',
             'motivated',
             'motivated',
             'dissatisfied',
             'dissatisfied'
             ),
    método = c('clasificación',
               'predicción',
               'clasificación',
               'predicción',
               'clasificación',
               'predicción',
               'clasificación',
               'predicción'
             ),
  "proporción" = c(paste0(nrow(perfil_1),
                          " (", round(100*nrow(perfil_1)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_1_pre),
                          " (", round(100*nrow(perfil_1_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_2),
                          " (", round(100*nrow(perfil_2)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_2_pre),
                          " (", round(100*nrow(perfil_2_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_3),
                          " (", round(100*nrow(perfil_3)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_3_pre),
                          " (", round(100*nrow(perfil_3_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_4),
                          " (", round(100*nrow(perfil_4)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_4_pre),
                          " (", round(100*nrow(perfil_4_pre)/nrow(rto_progreso), 2), "%)")
              ),
  't_rec' = comparacion_item('t_rec'),
  # 't_sup_req' = comparacion_item('t_sup_req'),
  # 'titulado' = comparacion_item('titulado'),
  # 'n_nodos_fin_titulacion' = comparacion_item('n_nodos_fin_titulacion'),
  'nota_media' = comparacion_item('nota_media'),
  'tasa_eficiencia' = comparacion_item('tasa_eficiencia'),
  't_exito' = comparacion_item('t_exito'),
  't_evaluacion' = comparacion_item('t_evaluacion'),
  'sa_asig_participacion' = comparacion_item('sa_asig_participacion'),
  'sa_asig_docente' = comparacion_item('sa_asig_docente'),
  'sa_asig_aprendiendo' = comparacion_item('sa_asig_aprendiendo'),
  'sa_curso_participacion' = comparacion_item('sa_curso_participacion'),
  'sa_curso_titulacion' = comparacion_item('sa_curso_titulacion')
)


comparacion = data.frame(
  perfil = c('dropout',
             'dropout',
             'common_graduate',
             'common_graduate',
             'motivated',
             'motivated',
             'dissatisfied',
             'dissatisfied'
             ),
    método = c('clasificación',
               'predicción',
               'clasificación',
               'predicción',
               'clasificación',
               'predicción',
               'clasificación',
               'predicción'
             ),
  "proporción" = c(paste0(nrow(perfil_1),
                          " (", round(100*nrow(perfil_1)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_1_pre),
                          " (", round(100*nrow(perfil_1_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_2),
                          " (", round(100*nrow(perfil_2)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_2_pre),
                          " (", round(100*nrow(perfil_2_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_3),
                          " (", round(100*nrow(perfil_3)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_3_pre),
                          " (", round(100*nrow(perfil_3_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_4),
                          " (", round(100*nrow(perfil_4)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_4_pre),
                          " (", round(100*nrow(perfil_4_pre)/nrow(rto_progreso), 2), "%)")
              ),
  't_rec' = comparacion_item('t_rec'),
  # 't_sup_req' = comparacion_item('t_sup_req'),
  # 'titulado' = comparacion_item('titulado'),
  # 'n_nodos_fin_titulacion' = comparacion_item('n_nodos_fin_titulacion'),
  'nota_media' = comparacion_item('nota_media'),
  'tasa_eficiencia' = comparacion_item('tasa_eficiencia'),
  't_exito' = comparacion_item('t_exito'),
  't_evaluacion' = comparacion_item('t_evaluacion'),
  'sa_asig_participacion' = comparacion_item('sa_asig_participacion'),
  'sa_asig_docente' = comparacion_item('sa_asig_docente'),
  'sa_asig_aprendiendo' = comparacion_item('sa_asig_aprendiendo'),
  'sa_curso_participacion' = comparacion_item('sa_curso_participacion'),
  'sa_curso_titulacion' = comparacion_item('sa_curso_titulacion')
)



comparacion_t = data.frame(t(comparacion[-1]))
# Añadimos los nombres de las columnas
colnames(comparacion_t) = comparacion[, 1]

# se muestran resultados
datatable(comparacion_t)
# se exportan resultados a latex
# print(xtable(comparacion_t), include.rownames = TRUE)

Y a continuación se muestran las características que definen a estudiantes en progreso.

2.4.7.4.2 Predición del perfil 1 del estudiantado: Dropout (59.59%): Estudiante que abandona los estudios.

El 59.59% del estudiantado en progreso analizado pertenece a esta categoría (en la clasificación era del 25.09%). Se caracteriza por:

  • con tasas de rendimiento (eficiencia, éxito y evaluación) superiores al 56% (en la clasificación eran del 41%);

  • reconocer un 4.37% de los requeridos (en la clasificación era de 3.92);

  • obtener una nota media de 7.42 (en la clasificación era de 7.56);

  • con participación en las encuestas de asignaturas (14.43%) y curso (13.98%) y satisfacción media manifestada (media de 4.3 en asignatura. En la clasificación era de 4.27).

A continuación se muestra el detalle la información descriptiva del perfil del estudiantado, incluyendo gráficos para cada variable, las frecuencias para cada valor y las etiquetas de las variables.

# https://cran.r-project.org/web/packages/summarytools/vignettes/rmarkdown.html#using-dfsummary-in-r-markdown
# se visualiza 
dfSummary(perfil_1_pre, 
          plain.ascii  = FALSE,
          style        = 'grid',
          graph.magnif = 0.85,
          varnumbers = FALSE,
          valid.col    = FALSE,
          tmp.img.dir  = "/tmp")

2.4.8 Data Frame Summary

2.4.8.1 perfil_1_pre

Dimensions: 4761 x 70
Duplicates: 11

Variable Stats / Values Freqs (% of Valid) Graph Missing
ste_codalf
[numeric]
Min : 0
Mean : 0.4
Max : 1
0 : 2708 (56.9%)
1 : 2053 (43.1%)
0
(0.0%)
sexo
[numeric]
Min : 0
Mean : 0.6
Max : 1
0 : 2115 (44.4%)
1 : 2646 (55.6%)
0
(0.0%)
nacionalidad
[numeric]
Min : 0
Mean : 0.9
Max : 1
0 : 671 (14.1%)
1 : 4090 (85.9%)
0
(0.0%)
titulado
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
tasa_eficiencia
[numeric]
Mean (sd) : 55.6 (32.9)
min < med < max:
0 < 60 < 100
IQR (CV) : 50 (0.6)
538 distinct values 0
(0.0%)
t_exito
[numeric]
Mean (sd) : 73.3 (35.1)
min < med < max:
0 < 88.9 < 100
IQR (CV) : 40 (0.5)
311 distinct values 0
(0.0%)
t_evaluacion
[numeric]
Mean (sd) : 66.6 (32.2)
min < med < max:
0 < 76.7 < 100
IQR (CV) : 45.7 (0.5)
516 distinct values 0
(0.0%)
t_rec
[numeric]
Mean (sd) : 4.4 (11.4)
min < med < max:
0 < 0 < 87.5
IQR (CV) : 0 (2.6)
61 distinct values 0
(0.0%)
t_sup_req
[numeric]
Mean (sd) : 36.8 (30.7)
min < med < max:
0 < 30 < 113.3
IQR (CV) : 50 (0.8)
128 distinct values 0
(0.0%)
edad_inicio
[numeric]
Mean (sd) : 31.9 (9.3)
min < med < max:
17 < 29 < 75
IQR (CV) : 13 (0.3)
55 distinct values 0
(0.0%)
acceso
[numeric]
Min : 0
Mean : 0.6
Max : 1
0 : 1970 (41.4%)
1 : 2791 (58.6%)
0
(0.0%)
complementos
[numeric]
Min : 0
Mean : 0.1
Max : 1
0 : 4373 (91.9%)
1 : 388 ( 8.1%)
0
(0.0%)
tasa_abandono
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
traslado_expediente
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 4714 (99.0%)
1 : 47 ( 1.0%)
0
(0.0%)
n_nodos_fin_titulacion
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
duracion_media_estudios
[numeric]
Mean (sd) : 2.2 (1.6)
min < med < max:
1 < 2 < 12
IQR (CV) : 1 (0.7)
12 distinct values 0
(0.0%)
nota_media
[numeric]
Mean (sd) : 7.4 (0.8)
min < med < max:
5 < 7.5 < 10
IQR (CV) : 1.1 (0.1)
1852 distinct values 0
(0.0%)
sa_asig_R
[numeric]
Min : 0
Mean : 0.1
Max : 1
0 : 4393 (92.3%)
1 : 368 ( 7.7%)
0
(0.0%)
sa_asig_participacion
[numeric]
Mean (sd) : 14.4 (28.7)
min < med < max:
0 < 0 < 100
IQR (CV) : 10.7 (2)
266 distinct values 0
(0.0%)
sa_asig_organizacion
[numeric]
Mean (sd) : 4.4 (0.3)
min < med < max:
1 < 4.3 < 5
IQR (CV) : 0 (0.1)
102 distinct values 0
(0.0%)
sa_asig_manual
[numeric]
Mean (sd) : 4.1 (0.4)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
135 distinct values 0
(0.0%)
sa_asig_materiales
[numeric]
Mean (sd) : 4.2 (0.3)
min < med < max:
1 < 4.2 < 5
IQR (CV) : 0 (0.1)
115 distinct values 0
(0.0%)
sa_asig_actividades
[numeric]
Mean (sd) : 4.3 (0.3)
min < med < max:
1 < 4.3 < 5
IQR (CV) : 0 (0.1)
125 distinct values 0
(0.0%)
sa_asig_docente
[numeric]
Mean (sd) : 4.5 (0.3)
min < med < max:
1 < 4.4 < 5
IQR (CV) : 0 (0.1)
114 distinct values 0
(0.0%)
sa_asig_aprendiendo
[numeric]
Mean (sd) : 89.7 (10.8)
min < med < max:
5.3 < 90.9 < 100
IQR (CV) : 0 (0.1)
98 distinct values 0
(0.0%)
sa_asig_comentarios
[numeric]
Mean (sd) : 0 (0.1)
min < med < max:
-0.5 < 0 < 1
IQR (CV) : 0 (4.2)
85 distinct values 0
(0.0%)
sa_curso_R
[numeric]
Min : 0
Mean : 0.1
Max : 1
0 : 4330 (90.9%)
1 : 431 ( 9.1%)
0
(0.0%)
sa_curso_participacion
[numeric]
Mean (sd) : 14 (31)
min < med < max:
0 < 0 < 100
IQR (CV) : 0 (2.2)
11 distinct values 0
(0.0%)
sa_curso_nivel_academico
[numeric]
Mean (sd) : 4 (0.4)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
22 distinct values 0
(0.0%)
sa_curso_implicacion
[numeric]
Mean (sd) : 4.6 (0.4)
min < med < max:
1 < 4.7 < 5
IQR (CV) : 0 (0.1)
18 distinct values 0
(0.0%)
sa_curso_aprovechamiento_recursos
[numeric]
Mean (sd) : 4 (0.4)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
22 distinct values 0
(0.0%)
sa_curso_titulacion
[numeric]
Mean (sd) : 4 (0.5)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
23 distinct values 0
(0.0%)
sa_curso_recomendacion
[numeric]
Mean (sd) : 99.4 (5.1)
min < med < max:
25 < 100 < 100
IQR (CV) : 0 (0.1)
25.00 : 1 ( 0.0%)
33.33 : 3 ( 0.1%)
40.00 : 2 ( 0.0%)
50.00 : 30 ( 0.6%)
60.00 : 1 ( 0.0%)
66.67 : 17 ( 0.4%)
75.00 : 6 ( 0.1%)
80.00 : 4 ( 0.1%)
100.00 : 4697 (98.7%)
0
(0.0%)
sa_curso_comentarios
[numeric]
Mean (sd) : 0 (0)
min < med < max:
-1 < 0 < 0.7
IQR (CV) : 0 (7.5)
70 distinct values 0
(0.0%)
sa_titulacion_R
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
sa_titulacion_participacion
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
sa_titulacion_nivel_academico
[numeric]
1 distinct value 4 : 4761 (100.0%) 0
(0.0%)
sa_titulacion_implicacion
[numeric]
1 distinct value 5 : 4761 (100.0%) 0
(0.0%)
sa_titulacion_aprovechamiento_recursos
[numeric]
1 distinct value 4 : 4761 (100.0%) 0
(0.0%)
sa_titulacion_mejora_profesional
[numeric]
1 distinct value 4 : 4761 (100.0%) 0
(0.0%)
sa_titulacion_obtener_trabajo
[numeric]
1 distinct value 3 : 4761 (100.0%) 0
(0.0%)
sa_titulacion_titulacion
[numeric]
1 distinct value 4 : 4761 (100.0%) 0
(0.0%)
sa_titulacion_recomendacion
[numeric]
1 distinct value 100 : 4761 (100.0%) 0
(0.0%)
sa_titulacion_comentarios
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
il_R
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
il_participacion
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
il_motivo_estudios
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
il_consecuencia_estudios
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
il_trabajo_actual
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
il_trabajo_actual_relacionado_estudios
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
il_comentarios
[numeric]
1 distinct value 0 : 4761 (100.0%) 0
(0.0%)
dias_laborable
[numeric]
Mean (sd) : 59.4 (13.8)
min < med < max:
0 < 61.2 < 100
IQR (CV) : 7.6 (0.2)
2095 distinct values 0
(0.0%)
dias_festivo
[numeric]
Mean (sd) : 40.6 (13.8)
min < med < max:
0 < 38.8 < 100
IQR (CV) : 7.6 (0.3)
2095 distinct values 0
(0.0%)
horario_mañana
[numeric]
Mean (sd) : 26.3 (14.4)
min < med < max:
0 < 25.3 < 100
IQR (CV) : 8.1 (0.5)
2135 distinct values 0
(0.0%)
horario_tarde
[numeric]
Mean (sd) : 51.9 (13.9)
min < med < max:
0 < 52.2 < 100
IQR (CV) : 7.4 (0.3)
2108 distinct values 0
(0.0%)
horario_noche
[numeric]
Mean (sd) : 20.3 (14.1)
min < med < max:
0 < 18.3 < 100
IQR (CV) : 9.2 (0.7)
2087 distinct values 0
(0.0%)
cen_codnum_11416
[integer]
Min : 0
Mean : 0.2
Max : 1
0 : 3950 (83.0%)
1 : 811 (17.0%)
0
(0.0%)
cen_codnum_11417
[integer]
Min : 0
Mean : 0.3
Max : 1
0 : 3312 (69.6%)
1 : 1449 (30.4%)
0
(0.0%)
cen_codnum_11418
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 4337 (91.1%)
1 : 424 ( 8.9%)
0
(0.0%)
cen_codnum_11419
[integer]
Min : 0
Mean : 0.3
Max : 1
0 : 3269 (68.7%)
1 : 1492 (31.3%)
0
(0.0%)
cen_codnum_11420
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 4176 (87.7%)
1 : 585 (12.3%)
0
(0.0%)
any_anyaca_acceso_1965-80
[integer]
Min : 0
Mean : 0
Max : 1
0 : 4740 (99.6%)
1 : 21 ( 0.4%)
0
(0.0%)
any_anyaca_acceso_1981-95
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 4464 (93.8%)
1 : 297 ( 6.2%)
0
(0.0%)
any_anyaca_acceso_1996-2010
[integer]
Min : 0
Mean : 0.3
Max : 1
0 : 3523 (74.0%)
1 : 1238 (26.0%)
0
(0.0%)
any_anyaca_acceso_2011-25
[integer]
Min : 0
Mean : 0.7
Max : 1
0 : 1556 (32.7%)
1 : 3205 (67.3%)
0
(0.0%)
any_anyaca_inicio_2008-13
[integer]
Min : 0
Mean : 0
Max : 1
0 : 4591 (96.4%)
1 : 170 ( 3.6%)
0
(0.0%)
any_anyaca_inicio_2014-19
[integer]
Min : 0
Mean : 0.5
Max : 1
0 : 2203 (46.3%)
1 : 2558 (53.7%)
0
(0.0%)
any_anyaca_inicio_2020-25
[integer]
Min : 0
Mean : 0.4
Max : 1
0 : 2728 (57.3%)
1 : 2033 (42.7%)
0
(0.0%)
pred_rf
[factor]
1. 1
2. 2
3. 3
4. 4
4761 (100.0%)
0 ( 0.0%)
0 ( 0.0%)
0 ( 0.0%)
0
(0.0%)
etiqueta
[character]
1. dropout 4761 (100.0%) 0
(0.0%)
2.4.8.1.1 Predición del perfil 2 del estudiantado: Common graduate (30.84%): Egresado común.

El 30.84% del estudiantado en progreso analizado pertenece a esta categoría (en la clasificación era del 59.59%). Se caracteriza por:

  • con tasas de rendimiento (eficiencia, éxito y evaluación) superiores al 91% (en la clasificación eran del 97%);

  • reconocer un 12.29% de los requeridos (en la clasificación era de 7.87);

  • obtener una nota media de 7.7 (en la clasificación era de 8.04);

  • con participación en las encuestas de asignaturas (26.23%) y curso (33.18%) y satisfacción media manifestada (media de 4.37 en asignatura. En la clasificación era de 4.3).

A continuación se muestra el detalle la información descriptiva del perfil del estudiantado, incluyendo gráficos para cada variable, las frecuencias para cada valor y las etiquetas de las variables.

# se visualiza 
dfSummary(perfil_2_pre, 
          plain.ascii  = FALSE,
          style        = 'grid',
          graph.magnif = 0.85,
          varnumbers = FALSE,
          valid.col    = FALSE,
          tmp.img.dir  = "/tmp")

2.4.9 Data Frame Summary

2.4.9.1 perfil_2_pre

Dimensions: 2464 x 70
Duplicates: 0

Variable Stats / Values Freqs (% of Valid) Graph Missing
ste_codalf
[numeric]
Min : 0
Mean : 0.5
Max : 1
0 : 1122 (45.5%)
1 : 1342 (54.5%)
0
(0.0%)
sexo
[numeric]
Min : 0
Mean : 0.6
Max : 1
0 : 952 (38.6%)
1 : 1512 (61.4%)
0
(0.0%)
nacionalidad
[numeric]
Min : 0
Mean : 0.9
Max : 1
0 : 300 (12.2%)
1 : 2164 (87.8%)
0
(0.0%)
titulado
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
tasa_eficiencia
[numeric]
Mean (sd) : 90.6 (10.8)
min < med < max:
52.5 < 92.9 < 100
IQR (CV) : 16.1 (0.1)
260 distinct values 0
(0.0%)
t_exito
[numeric]
Mean (sd) : 96 (6.9)
min < med < max:
60 < 100 < 100
IQR (CV) : 6.2 (0.1)
150 distinct values 0
(0.0%)
t_evaluacion
[numeric]
Mean (sd) : 94.3 (8.7)
min < med < max:
56.7 < 100 < 100
IQR (CV) : 10 (0.1)
199 distinct values 0
(0.0%)
t_rec
[numeric]
Mean (sd) : 12.3 (17.3)
min < med < max:
0 < 2.5 < 86.7
IQR (CV) : 20 (1.4)
67 distinct values 0
(0.0%)
t_sup_req
[numeric]
Mean (sd) : 67.7 (24.4)
min < med < max:
5 < 68.1 < 130
IQR (CV) : 37.5 (0.4)
123 distinct values 0
(0.0%)
edad_inicio
[numeric]
Mean (sd) : 31.8 (8.9)
min < med < max:
17 < 29 < 73
IQR (CV) : 13 (0.3)
50 distinct values 0
(0.0%)
acceso
[numeric]
Min : 0
Mean : 0.7
Max : 1
0 : 855 (34.7%)
1 : 1609 (65.3%)
0
(0.0%)
complementos
[numeric]
Min : 0
Mean : 0.1
Max : 1
0 : 2191 (88.9%)
1 : 273 (11.1%)
0
(0.0%)
tasa_abandono
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
traslado_expediente
[numeric]
Min : 0
Mean : 0
Max : 1
0 : 2460 (99.8%)
1 : 4 ( 0.2%)
0
(0.0%)
n_nodos_fin_titulacion
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
duracion_media_estudios
[numeric]
Mean (sd) : 2.6 (1.6)
min < med < max:
1 < 2 < 13
IQR (CV) : 1 (0.6)
11 distinct values 0
(0.0%)
nota_media
[numeric]
Mean (sd) : 7.7 (0.8)
min < med < max:
5.4 < 7.7 < 9.7
IQR (CV) : 1.1 (0.1)
1547 distinct values 0
(0.0%)
sa_asig_R
[numeric]
Min : 0
Mean : 0.2
Max : 1
0 : 2069 (84.0%)
1 : 395 (16.0%)
0
(0.0%)
sa_asig_participacion
[numeric]
Mean (sd) : 26.2 (35.4)
min < med < max:
0 < 0 < 100
IQR (CV) : 50 (1.3)
234 distinct values 0
(0.0%)
sa_asig_organizacion
[numeric]
Mean (sd) : 4.5 (0.3)
min < med < max:
2 < 4.3 < 5
IQR (CV) : 0.3 (0.1)
98 distinct values 0
(0.0%)
sa_asig_manual
[numeric]
Mean (sd) : 4.2 (0.4)
min < med < max:
1 < 4 < 5
IQR (CV) : 0.3 (0.1)
138 distinct values 0
(0.0%)
sa_asig_materiales
[numeric]
Mean (sd) : 4.3 (0.4)
min < med < max:
2.5 < 4.2 < 5
IQR (CV) : 0.3 (0.1)
113 distinct values 0
(0.0%)
sa_asig_actividades
[numeric]
Mean (sd) : 4.4 (0.3)
min < med < max:
2 < 4.3 < 5
IQR (CV) : 0.2 (0.1)
105 distinct values 0
(0.0%)
sa_asig_docente
[numeric]
Mean (sd) : 4.5 (0.3)
min < med < max:
2 < 4.4 < 5
IQR (CV) : 0.3 (0.1)
97 distinct values 0
(0.0%)
sa_asig_aprendiendo
[numeric]
Mean (sd) : 89.9 (12.2)
min < med < max:
9.1 < 90.9 < 100
IQR (CV) : 9.1 (0.1)
97 distinct values 0
(0.0%)
sa_asig_comentarios
[numeric]
Mean (sd) : 0 (0.1)
min < med < max:
-0.8 < 0 < 1
IQR (CV) : 0 (2.7)
79 distinct values 0
(0.0%)
sa_curso_R
[numeric]
Min : 0
Mean : 0.2
Max : 1
0 : 1891 (76.7%)
1 : 573 (23.3%)
0
(0.0%)
sa_curso_participacion
[numeric]
Mean (sd) : 33.2 (41.8)
min < med < max:
0 < 0 < 100
IQR (CV) : 66.7 (1.3)
11 distinct values 0
(0.0%)
sa_curso_nivel_academico
[numeric]
Mean (sd) : 4.1 (0.5)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
25 distinct values 0
(0.0%)
sa_curso_implicacion
[numeric]
Mean (sd) : 4.6 (0.4)
min < med < max:
1 < 4.7 < 5
IQR (CV) : 0 (0.1)
14 distinct values 0
(0.0%)
sa_curso_aprovechamiento_recursos
[numeric]
Mean (sd) : 4.1 (0.5)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
22 distinct values 0
(0.0%)
sa_curso_titulacion
[numeric]
Mean (sd) : 4.1 (0.6)
min < med < max:
1 < 4 < 5
IQR (CV) : 0 (0.1)
23 distinct values 0
(0.0%)
sa_curso_recomendacion
[numeric]
Mean (sd) : 98.7 (7.7)
min < med < max:
25 < 100 < 100
IQR (CV) : 0 (0.1)
25.00 : 1 ( 0.0%)
33.33 : 6 ( 0.2%)
50.00 : 37 ( 1.5%)
60.00 : 2 ( 0.1%)
66.67 : 13 ( 0.5%)
75.00 : 8 ( 0.3%)
80.00 : 5 ( 0.2%)
100.00 : 2392 (97.1%)
0
(0.0%)
sa_curso_comentarios
[numeric]
Mean (sd) : 0 (0.1)
min < med < max:
-1 < 0 < 1
IQR (CV) : 0 (4)
79 distinct values 0
(0.0%)
sa_titulacion_R
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
sa_titulacion_participacion
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
sa_titulacion_nivel_academico
[numeric]
1 distinct value 4 : 2464 (100.0%) 0
(0.0%)
sa_titulacion_implicacion
[numeric]
1 distinct value 5 : 2464 (100.0%) 0
(0.0%)
sa_titulacion_aprovechamiento_recursos
[numeric]
1 distinct value 4 : 2464 (100.0%) 0
(0.0%)
sa_titulacion_mejora_profesional
[numeric]
1 distinct value 4 : 2464 (100.0%) 0
(0.0%)
sa_titulacion_obtener_trabajo
[numeric]
1 distinct value 3 : 2464 (100.0%) 0
(0.0%)
sa_titulacion_titulacion
[numeric]
1 distinct value 4 : 2464 (100.0%) 0
(0.0%)
sa_titulacion_recomendacion
[numeric]
1 distinct value 100 : 2464 (100.0%) 0
(0.0%)
sa_titulacion_comentarios
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
il_R
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
il_participacion
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
il_motivo_estudios
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
il_consecuencia_estudios
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
il_trabajo_actual
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
il_trabajo_actual_relacionado_estudios
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
il_comentarios
[numeric]
1 distinct value 0 : 2464 (100.0%) 0
(0.0%)
dias_laborable
[numeric]
Mean (sd) : 60.5 (13.4)
min < med < max:
0 < 61.2 < 100
IQR (CV) : 8 (0.2)
1203 distinct values 0
(0.0%)
dias_festivo
[numeric]
Mean (sd) : 39.5 (13.4)
min < med < max:
0 < 38.8 < 100
IQR (CV) : 8 (0.3)
1203 distinct values 0
(0.0%)
horario_mañana
[numeric]
Mean (sd) : 27.3 (14.8)
min < med < max:
0 < 25.3 < 100
IQR (CV) : 8.4 (0.5)
1224 distinct values 0
(0.0%)
horario_tarde
[numeric]
Mean (sd) : 51.7 (14.1)
min < med < max:
0 < 52.2 < 100
IQR (CV) : 6.7 (0.3)
1219 distinct values 0
(0.0%)
horario_noche
[numeric]
Mean (sd) : 19.6 (14.2)
min < med < max:
0 < 18.3 < 100
IQR (CV) : 9.2 (0.7)
1182 distinct values 0
(0.0%)
cen_codnum_11416
[integer]
Min : 0
Mean : 0.2
Max : 1
0 : 2088 (84.7%)
1 : 376 (15.3%)
0
(0.0%)
cen_codnum_11417
[integer]
Min : 0
Mean : 0.4
Max : 1
0 : 1583 (64.2%)
1 : 881 (35.8%)
0
(0.0%)
cen_codnum_11418
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 2332 (94.6%)
1 : 132 ( 5.4%)
0
(0.0%)
cen_codnum_11419
[integer]
Min : 0
Mean : 0.4
Max : 1
0 : 1557 (63.2%)
1 : 907 (36.8%)
0
(0.0%)
cen_codnum_11420
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 2296 (93.2%)
1 : 168 ( 6.8%)
0
(0.0%)
any_anyaca_acceso_1965-80
[integer]
Min : 0
Mean : 0
Max : 1
0 : 2460 (99.8%)
1 : 4 ( 0.2%)
0
(0.0%)
any_anyaca_acceso_1981-95
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 2332 (94.6%)
1 : 132 ( 5.4%)
0
(0.0%)
any_anyaca_acceso_1996-2010
[integer]
Min : 0
Mean : 0.3
Max : 1
0 : 1787 (72.5%)
1 : 677 (27.5%)
0
(0.0%)
any_anyaca_acceso_2011-25
[integer]
Min : 0
Mean : 0.7
Max : 1
0 : 813 (33.0%)
1 : 1651 (67.0%)
0
(0.0%)
any_anyaca_inicio_2008-13
[integer]
Min : 0
Mean : 0
Max : 1
0 : 2413 (97.9%)
1 : 51 ( 2.1%)
0
(0.0%)
any_anyaca_inicio_2014-19
[integer]
Min : 0
Mean : 0.5
Max : 1
0 : 1170 (47.5%)
1 : 1294 (52.5%)
0
(0.0%)
any_anyaca_inicio_2020-25
[integer]
Min : 0
Mean : 0.5
Max : 1
0 : 1345 (54.6%)
1 : 1119 (45.4%)
0
(0.0%)
pred_rf
[factor]
1. 1
2. 2
3. 3
4. 4
0 ( 0.0%)
2464 (100.0%)
0 ( 0.0%)
0 ( 0.0%)
0
(0.0%)
etiqueta
[character]
1. common_graduate 2464 (100.0%) 0
(0.0%)
2.4.9.1.1 Predición del perfil 3 del estudiantado: Motivated (1.11%): Egresado especialista, con sentido de pertenencia a la universidad (alta implicación en la mejora) y alta satisfacción.

El 1.11% del estudiantado en progreso analizado pertenece a esta categoría (en la clasificación era del 8.76%). Se caracteriza por:

  • con tasas de rendimiento (eficiencia, éxito y evaluación) superiores al 93% (en la clasificación eran del 97%);

  • reconocer un 12.34% de los requeridos (en la clasificación era de 9.27);

  • obtener una nota media de 7.79 (en la clasificación era de 8.03);

  • con participación en las encuestas de asignaturas (57.85%) y curso (73.69%) y satisfacción media manifestada (media de 4.19 en asignatura. En la clasificación era de 4.22).

A continuación se muestra el detalle la información descriptiva del perfil del estudiantado, incluyendo gráficos para cada variable, las frecuencias para cada valor y las etiquetas de las variables.

# se visualiza 
dfSummary(perfil_3_pre, 
          plain.ascii  = FALSE,
          style        = 'grid',
          graph.magnif = 0.85,
          varnumbers = FALSE,
          valid.col    = FALSE,
          tmp.img.dir  = "/tmp")

2.4.10 Data Frame Summary

2.4.10.1 perfil_3_pre

Dimensions: 89 x 70
Duplicates: 0

Variable Stats / Values Freqs (% of Valid) Graph Missing
ste_codalf
[numeric]
Min : 0
Mean : 0.5
Max : 1
0 : 45 (50.6%)
1 : 44 (49.4%)
0
(0.0%)
sexo
[numeric]
Min : 0
Mean : 0.6
Max : 1
0 : 34 (38.2%)
1 : 55 (61.8%)
0
(0.0%)
nacionalidad
[numeric]
Min : 0
Mean : 0.9
Max : 1
0 : 12 (13.5%)
1 : 77 (86.5%)
0
(0.0%)
titulado
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
tasa_eficiencia
[numeric]
Mean (sd) : 93.1 (8.7)
min < med < max:
68.3 < 100 < 100
IQR (CV) : 12.8 (0.1)
30 distinct values 0
(0.0%)
t_exito
[numeric]
Mean (sd) : 96.8 (5.9)
min < med < max:
79.2 < 100 < 100
IQR (CV) : 5.6 (0.1)
18 distinct values 0
(0.0%)
t_evaluacion
[numeric]
Mean (sd) : 96.2 (6.9)
min < med < max:
70.6 < 100 < 100
IQR (CV) : 6.2 (0.1)
21 distinct values 0
(0.0%)
t_rec
[numeric]
Mean (sd) : 12.3 (16.1)
min < med < max:
0 < 5 < 60
IQR (CV) : 22.5 (1.3)
25 distinct values 0
(0.0%)
t_sup_req
[numeric]
Mean (sd) : 65.4 (25.5)
min < med < max:
5 < 68.3 < 120
IQR (CV) : 39.2 (0.4)
39 distinct values 0
(0.0%)
edad_inicio
[numeric]
Mean (sd) : 37.2 (10.6)
min < med < max:
17 < 38 < 69
IQR (CV) : 18 (0.3)
36 distinct values 0
(0.0%)
acceso
[numeric]
Min : 0
Mean : 0.6
Max : 1
0 : 34 (38.2%)
1 : 55 (61.8%)
0
(0.0%)
complementos
[numeric]
Min : 0
Mean : 0.1
Max : 1
0 : 84 (94.4%)
1 : 5 ( 5.6%)
0
(0.0%)
tasa_abandono
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
traslado_expediente
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
n_nodos_fin_titulacion
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
duracion_media_estudios
[numeric]
Mean (sd) : 2.8 (1.8)
min < med < max:
1 < 2 < 10
IQR (CV) : 1 (0.7)
1 : 12 (13.5%)
2 : 49 (55.1%)
3 : 9 (10.1%)
4 : 6 ( 6.7%)
5 : 6 ( 6.7%)
6 : 1 ( 1.1%)
7 : 2 ( 2.2%)
8 : 2 ( 2.2%)
9 : 1 ( 1.1%)
10 : 1 ( 1.1%)
0
(0.0%)
nota_media
[numeric]
Mean (sd) : 7.8 (0.8)
min < med < max:
5.6 < 7.7 < 9.9
IQR (CV) : 1.1 (0.1)
83 distinct values 0
(0.0%)
sa_asig_R
[numeric]
Min : 0
Mean : 0.4
Max : 1
0 : 52 (58.4%)
1 : 37 (41.6%)
0
(0.0%)
sa_asig_participacion
[numeric]
Mean (sd) : 57.8 (35.8)
min < med < max:
0 < 60 < 100
IQR (CV) : 68 (0.6)
45 distinct values 0
(0.0%)
sa_asig_organizacion
[numeric]
Mean (sd) : 4.3 (0.4)
min < med < max:
3.3 < 4.3 < 5
IQR (CV) : 0.5 (0.1)
33 distinct values 0
(0.0%)
sa_asig_manual
[numeric]
Mean (sd) : 4 (0.6)
min < med < max:
2 < 4 < 5
IQR (CV) : 0.6 (0.2)
42 distinct values 0
(0.0%)
sa_asig_materiales
[numeric]
Mean (sd) : 4.2 (0.5)
min < med < max:
3 < 4.2 < 5
IQR (CV) : 0.5 (0.1)
33 distinct values 0
(0.0%)
sa_asig_actividades
[numeric]
Mean (sd) : 4.1 (0.5)
min < med < max:
2 < 4.2 < 5
IQR (CV) : 0.5 (0.1)
37 distinct values 0
(0.0%)
sa_asig_docente
[numeric]
Mean (sd) : 4.4 (0.4)
min < med < max:
3 < 4.4 < 5
IQR (CV) : 0.7 (0.1)
38 distinct values 0
(0.0%)
sa_asig_aprendiendo
[numeric]
Mean (sd) : 75.1 (27)
min < med < max:
10 < 90 < 100
IQR (CV) : 50 (0.4)
30 distinct values 0
(0.0%)
sa_asig_comentarios
[numeric]
Mean (sd) : 0.1 (0.1)
min < med < max:
-0.1 < 0 < 0.4
IQR (CV) : 0.1 (1.6)
29 distinct values 0
(0.0%)
sa_curso_R
[numeric]
Min : 0
Mean : 0.7
Max : 1
0 : 31 (34.8%)
1 : 58 (65.2%)
0
(0.0%)
sa_curso_participacion
[numeric]
Mean (sd) : 73.7 (39.7)
min < med < max:
0 < 100 < 100
IQR (CV) : 50 (0.5)
0.00 : 16 (18.0%)
20.00 : 1 ( 1.1%)
33.33 : 2 ( 2.2%)
40.00 : 1 ( 1.1%)
50.00 : 7 ( 7.9%)
60.00 : 1 ( 1.1%)
66.67 : 1 ( 1.1%)
75.00 : 1 ( 1.1%)
80.00 : 1 ( 1.1%)
100.00 : 58 (65.2%)
0
(0.0%)
sa_curso_nivel_academico
[numeric]
Mean (sd) : 4.1 (0.6)
min < med < max:
2 < 4 < 5
IQR (CV) : 1 (0.2)
11 distinct values 0
(0.0%)
sa_curso_implicacion
[numeric]
Mean (sd) : 4.5 (0.6)
min < med < max:
3 < 4.7 < 5
IQR (CV) : 1 (0.1)
3.00 : 6 ( 6.7%)
3.50 : 2 ( 2.2%)
4.00 : 20 (22.5%)
4.33 : 1 ( 1.1%)
4.50 : 4 ( 4.5%)
4.67 : 16 (18.0%)
4.75 : 1 ( 1.1%)
5.00 : 39 (43.8%)
0
(0.0%)
sa_curso_aprovechamiento_recursos
[numeric]
Mean (sd) : 4.1 (0.7)
min < med < max:
2 < 4 < 5
IQR (CV) : 1 (0.2)
13 distinct values 0
(0.0%)
sa_curso_titulacion
[numeric]
Mean (sd) : 4 (0.8)
min < med < max:
1 < 4 < 5
IQR (CV) : 0.5 (0.2)
12 distinct values 0
(0.0%)
sa_curso_recomendacion
[numeric]
Mean (sd) : 94.9 (14.3)
min < med < max:
50 < 100 < 100
IQR (CV) : 0 (0.2)
50.00 : 7 ( 7.9%)
66.67 : 1 ( 1.1%)
75.00 : 2 ( 2.2%)
80.00 : 1 ( 1.1%)
100.00 : 78 (87.6%)
0
(0.0%)
sa_curso_comentarios
[numeric]
Mean (sd) : 0 (0.1)
min < med < max:
-0.3 < 0 < 0.6
IQR (CV) : 0 (3.1)
25 distinct values 0
(0.0%)
sa_titulacion_R
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
sa_titulacion_participacion
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
sa_titulacion_nivel_academico
[numeric]
1 distinct value 4 : 89 (100.0%) 0
(0.0%)
sa_titulacion_implicacion
[numeric]
1 distinct value 5 : 89 (100.0%) 0
(0.0%)
sa_titulacion_aprovechamiento_recursos
[numeric]
1 distinct value 4 : 89 (100.0%) 0
(0.0%)
sa_titulacion_mejora_profesional
[numeric]
1 distinct value 4 : 89 (100.0%) 0
(0.0%)
sa_titulacion_obtener_trabajo
[numeric]
1 distinct value 3 : 89 (100.0%) 0
(0.0%)
sa_titulacion_titulacion
[numeric]
1 distinct value 4 : 89 (100.0%) 0
(0.0%)
sa_titulacion_recomendacion
[numeric]
1 distinct value 100 : 89 (100.0%) 0
(0.0%)
sa_titulacion_comentarios
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
il_R
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
il_participacion
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
il_motivo_estudios
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
il_consecuencia_estudios
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
il_trabajo_actual
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
il_trabajo_actual_relacionado_estudios
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
il_comentarios
[numeric]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
dias_laborable
[numeric]
Mean (sd) : 62.3 (15.8)
min < med < max:
0 < 61.2 < 100
IQR (CV) : 7.6 (0.3)
57 distinct values 0
(0.0%)
dias_festivo
[numeric]
Mean (sd) : 37.7 (15.8)
min < med < max:
0 < 38.8 < 100
IQR (CV) : 7.6 (0.4)
57 distinct values 0
(0.0%)
horario_mañana
[numeric]
Mean (sd) : 26.2 (15.6)
min < med < max:
0 < 25.3 < 76.6
IQR (CV) : 14 (0.6)
57 distinct values 0
(0.0%)
horario_tarde
[numeric]
Mean (sd) : 55.3 (16.8)
min < med < max:
18.8 < 52.2 < 100
IQR (CV) : 13 (0.3)
60 distinct values 0
(0.0%)
horario_noche
[numeric]
Mean (sd) : 17.2 (14.6)
min < med < max:
0 < 18.3 < 76.1
IQR (CV) : 10.5 (0.8)
56 distinct values 0
(0.0%)
cen_codnum_11416
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 81 (91.0%)
1 : 8 ( 9.0%)
0
(0.0%)
cen_codnum_11417
[integer]
Min : 0
Mean : 0.3
Max : 1
0 : 66 (74.2%)
1 : 23 (25.8%)
0
(0.0%)
cen_codnum_11418
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 79 (88.8%)
1 : 10 (11.2%)
0
(0.0%)
cen_codnum_11419
[integer]
Min : 0
Mean : 0.4
Max : 1
0 : 52 (58.4%)
1 : 37 (41.6%)
0
(0.0%)
cen_codnum_11420
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 78 (87.6%)
1 : 11 (12.4%)
0
(0.0%)
any_anyaca_acceso_1965-80
[integer]
1 distinct value 0 : 89 (100.0%) 0
(0.0%)
any_anyaca_acceso_1981-95
[integer]
Min : 0
Mean : 0.2
Max : 1
0 : 74 (83.1%)
1 : 15 (16.9%)
0
(0.0%)
any_anyaca_acceso_1996-2010
[integer]
Min : 0
Mean : 0.3
Max : 1
0 : 63 (70.8%)
1 : 26 (29.2%)
0
(0.0%)
any_anyaca_acceso_2011-25
[integer]
Min : 0
Mean : 0.5
Max : 1
0 : 41 (46.1%)
1 : 48 (53.9%)
0
(0.0%)
any_anyaca_inicio_2008-13
[integer]
Min : 0
Mean : 0
Max : 1
0 : 85 (95.5%)
1 : 4 ( 4.5%)
0
(0.0%)
any_anyaca_inicio_2014-19
[integer]
Min : 0
Mean : 0.5
Max : 1
0 : 47 (52.8%)
1 : 42 (47.2%)
0
(0.0%)
any_anyaca_inicio_2020-25
[integer]
Min : 0
Mean : 0.5
Max : 1
0 : 46 (51.7%)
1 : 43 (48.3%)
0
(0.0%)
pred_rf
[factor]
1. 1
2. 2
3. 3
4. 4
0 ( 0.0%)
0 ( 0.0%)
89 (100.0%)
0 ( 0.0%)
0
(0.0%)
etiqueta
[character]
1. motivated 89 (100.0%) 0
(0.0%)
2.4.10.1.1 Predición del perfil 4 del estudiantado: Dissatisfied (8.45%): Egresado con satisfacción inferior a la media.

El 8.45% del estudiantado en progreso analizado pertenece a esta categoría (en la clasificación era del 6.55%). Se caracteriza por:

  • con tasas de rendimiento (eficiencia, éxito y evaluación) superiores al 84% (en la clasificación eran del 94%);

  • reconocer un 10.55% de los requeridos (en la clasificación era de 11.15);

  • obtener una nota media de 7.75 (en la clasificación era de 7.97);

  • con participación en las encuestas de asignaturas (57.07%) y curso (48.87%) y satisfacción media manifestada (media de 3.16 en asignatura. En la clasificación era de 3.2).

A continuación se muestra el detalle la información descriptiva del perfil del estudiantado, incluyendo gráficos para cada variable, las frecuencias para cada valor y las etiquetas de las variables.

# se visualiza 
dfSummary(perfil_4_pre, 
          plain.ascii  = FALSE,
          style        = 'grid',
          graph.magnif = 0.85,
          varnumbers = FALSE,
          valid.col    = FALSE,
          tmp.img.dir  = "/tmp")

2.4.11 Data Frame Summary

2.4.11.1 perfil_4_pre

Dimensions: 675 x 70
Duplicates: 0

Variable Stats / Values Freqs (% of Valid) Graph Missing
ste_codalf
[numeric]
Min : 0
Mean : 0.4
Max : 1
0 : 410 (60.7%)
1 : 265 (39.3%)
0
(0.0%)
sexo
[numeric]
Min : 0
Mean : 0.6
Max : 1
0 : 242 (35.9%)
1 : 433 (64.1%)
0
(0.0%)
nacionalidad
[numeric]
Min : 0
Mean : 0.9
Max : 1
0 : 68 (10.1%)
1 : 607 (89.9%)
0
(0.0%)
titulado
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
tasa_eficiencia
[numeric]
Mean (sd) : 84.2 (19.2)
min < med < max:
0 < 90 < 100
IQR (CV) : 21.5 (0.2)
168 distinct values 0
(0.0%)
t_exito
[numeric]
Mean (sd) : 92.7 (14.1)
min < med < max:
0 < 100 < 100
IQR (CV) : 10.5 (0.2)
115 distinct values 0
(0.0%)
t_evaluacion
[numeric]
Mean (sd) : 89.8 (15.5)
min < med < max:
0 < 96.4 < 100
IQR (CV) : 15 (0.2)
134 distinct values 0
(0.0%)
t_rec
[numeric]
Mean (sd) : 10.5 (15.5)
min < med < max:
0 < 0 < 80
IQR (CV) : 17.5 (1.5)
47 distinct values 0
(0.0%)
t_sup_req
[numeric]
Mean (sd) : 62.1 (28.3)
min < med < max:
0 < 66.7 < 126.7
IQR (CV) : 45 (0.5)
90 distinct values 0
(0.0%)
edad_inicio
[numeric]
Mean (sd) : 33.3 (8.9)
min < med < max:
17 < 32 < 62
IQR (CV) : 14 (0.3)
43 distinct values 0
(0.0%)
acceso
[numeric]
Min : 0
Mean : 0.6
Max : 1
0 : 289 (42.8%)
1 : 386 (57.2%)
0
(0.0%)
complementos
[numeric]
Min : 0
Mean : 0.1
Max : 1
0 : 634 (93.9%)
1 : 41 ( 6.1%)
0
(0.0%)
tasa_abandono
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
traslado_expediente
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
n_nodos_fin_titulacion
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
duracion_media_estudios
[numeric]
Mean (sd) : 3 (2.1)
min < med < max:
1 < 2 < 12
IQR (CV) : 2 (0.7)
12 distinct values 0
(0.0%)
nota_media
[numeric]
Mean (sd) : 7.7 (0.8)
min < med < max:
5.2 < 7.8 < 9.8
IQR (CV) : 1.1 (0.1)
564 distinct values 0
(0.0%)
sa_asig_R
[numeric]
Min : 0
Mean : 0.4
Max : 1
0 : 436 (64.6%)
1 : 239 (35.4%)
0
(0.0%)
sa_asig_participacion
[numeric]
Mean (sd) : 57.1 (31.7)
min < med < max:
3.3 < 53.9 < 100
IQR (CV) : 59.7 (0.6)
191 distinct values 0
(0.0%)
sa_asig_organizacion
[numeric]
Mean (sd) : 3.3 (0.8)
min < med < max:
1 < 3.4 < 5
IQR (CV) : 0.8 (0.2)
123 distinct values 0
(0.0%)
sa_asig_manual
[numeric]
Mean (sd) : 3 (0.8)
min < med < max:
1 < 3.1 < 5
IQR (CV) : 1 (0.3)
137 distinct values 0
(0.0%)
sa_asig_materiales
[numeric]
Mean (sd) : 3 (0.8)
min < med < max:
1 < 3.2 < 5
IQR (CV) : 0.9 (0.3)
127 distinct values 0
(0.0%)
sa_asig_actividades
[numeric]
Mean (sd) : 3.1 (0.8)
min < med < max:
1 < 3.3 < 4.6
IQR (CV) : 0.9 (0.2)
126 distinct values 0
(0.0%)
sa_asig_docente
[numeric]
Mean (sd) : 3.3 (0.8)
min < med < max:
1 < 3.5 < 5
IQR (CV) : 1 (0.3)
139 distinct values 0
(0.0%)
sa_asig_aprendiendo
[numeric]
Mean (sd) : 68.3 (25)
min < med < max:
6.2 < 71.4 < 100
IQR (CV) : 40.9 (0.4)
92 distinct values 0
(0.0%)
sa_asig_comentarios
[numeric]
Mean (sd) : 0.1 (0.1)
min < med < max:
-0.5 < 0.1 < 1
IQR (CV) : 0.1 (1.7)
77 distinct values 0
(0.0%)
sa_curso_R
[numeric]
Min : 0
Mean : 0.3
Max : 1
0 : 448 (66.4%)
1 : 227 (33.6%)
0
(0.0%)
sa_curso_participacion
[numeric]
Mean (sd) : 48.9 (42.7)
min < med < max:
0 < 50 < 100
IQR (CV) : 100 (0.9)
11 distinct values 0
(0.0%)
sa_curso_nivel_academico
[numeric]
Mean (sd) : 3.8 (0.7)
min < med < max:
1 < 4 < 5
IQR (CV) : 0.3 (0.2)
21 distinct values 0
(0.0%)
sa_curso_implicacion
[numeric]
Mean (sd) : 4.4 (0.7)
min < med < max:
1 < 4.7 < 5
IQR (CV) : 0.7 (0.1)
15 distinct values 0
(0.0%)
sa_curso_aprovechamiento_recursos
[numeric]
Mean (sd) : 3.8 (0.7)
min < med < max:
1 < 4 < 5
IQR (CV) : 0.3 (0.2)
27 distinct values 0
(0.0%)
sa_curso_titulacion
[numeric]
Mean (sd) : 3.5 (0.9)
min < med < max:
1 < 4 < 5
IQR (CV) : 1 (0.3)
24 distinct values 0
(0.0%)
sa_curso_recomendacion
[numeric]
Mean (sd) : 94.6 (16)
min < med < max:
25 < 100 < 100
IQR (CV) : 0 (0.2)
25.00 : 3 ( 0.4%)
33.33 : 10 ( 1.5%)
40.00 : 3 ( 0.4%)
50.00 : 41 ( 6.1%)
60.00 : 1 ( 0.1%)
66.67 : 11 ( 1.6%)
75.00 : 4 ( 0.6%)
80.00 : 1 ( 0.1%)
100.00 : 601 (89.0%)
0
(0.0%)
sa_curso_comentarios
[numeric]
Mean (sd) : 0 (0.1)
min < med < max:
-0.4 < 0 < 0.9
IQR (CV) : 0 (3.1)
56 distinct values 0
(0.0%)
sa_titulacion_R
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
sa_titulacion_participacion
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
sa_titulacion_nivel_academico
[numeric]
1 distinct value 4 : 675 (100.0%) 0
(0.0%)
sa_titulacion_implicacion
[numeric]
1 distinct value 5 : 675 (100.0%) 0
(0.0%)
sa_titulacion_aprovechamiento_recursos
[numeric]
1 distinct value 4 : 675 (100.0%) 0
(0.0%)
sa_titulacion_mejora_profesional
[numeric]
1 distinct value 4 : 675 (100.0%) 0
(0.0%)
sa_titulacion_obtener_trabajo
[numeric]
1 distinct value 3 : 675 (100.0%) 0
(0.0%)
sa_titulacion_titulacion
[numeric]
1 distinct value 4 : 675 (100.0%) 0
(0.0%)
sa_titulacion_recomendacion
[numeric]
1 distinct value 100 : 675 (100.0%) 0
(0.0%)
sa_titulacion_comentarios
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
il_R
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
il_participacion
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
il_motivo_estudios
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
il_consecuencia_estudios
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
il_trabajo_actual
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
il_trabajo_actual_relacionado_estudios
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
il_comentarios
[numeric]
1 distinct value 0 : 675 (100.0%) 0
(0.0%)
dias_laborable
[numeric]
Mean (sd) : 60.5 (14.1)
min < med < max:
0 < 61.2 < 100
IQR (CV) : 8.9 (0.2)
459 distinct values 0
(0.0%)
dias_festivo
[numeric]
Mean (sd) : 39.5 (14.1)
min < med < max:
0 < 38.8 < 100
IQR (CV) : 8.9 (0.4)
459 distinct values 0
(0.0%)
horario_mañana
[numeric]
Mean (sd) : 28.5 (15.5)
min < med < max:
0 < 25.3 < 100
IQR (CV) : 14.6 (0.5)
455 distinct values 0
(0.0%)
horario_tarde
[numeric]
Mean (sd) : 52.2 (14.6)
min < med < max:
0 < 52.2 < 100
IQR (CV) : 9.8 (0.3)
469 distinct values 0
(0.0%)
horario_noche
[numeric]
Mean (sd) : 18.4 (13.8)
min < med < max:
0 < 18.3 < 100
IQR (CV) : 12.1 (0.8)
443 distinct values 0
(0.0%)
cen_codnum_11416
[integer]
Min : 0
Mean : 0.2
Max : 1
0 : 571 (84.6%)
1 : 104 (15.4%)
0
(0.0%)
cen_codnum_11417
[integer]
Min : 0
Mean : 0.2
Max : 1
0 : 536 (79.4%)
1 : 139 (20.6%)
0
(0.0%)
cen_codnum_11418
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 636 (94.2%)
1 : 39 ( 5.8%)
0
(0.0%)
cen_codnum_11419
[integer]
Min : 0
Mean : 0.5
Max : 1
0 : 371 (55.0%)
1 : 304 (45.0%)
0
(0.0%)
cen_codnum_11420
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 586 (86.8%)
1 : 89 (13.2%)
0
(0.0%)
any_anyaca_acceso_1965-80
[integer]
Min : 0
Mean : 0
Max : 1
0 : 673 (99.7%)
1 : 2 ( 0.3%)
0
(0.0%)
any_anyaca_acceso_1981-95
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 631 (93.5%)
1 : 44 ( 6.5%)
0
(0.0%)
any_anyaca_acceso_1996-2010
[integer]
Min : 0
Mean : 0.3
Max : 1
0 : 442 (65.5%)
1 : 233 (34.5%)
0
(0.0%)
any_anyaca_acceso_2011-25
[integer]
Min : 0
Mean : 0.6
Max : 1
0 : 279 (41.3%)
1 : 396 (58.7%)
0
(0.0%)
any_anyaca_inicio_2008-13
[integer]
Min : 0
Mean : 0.1
Max : 1
0 : 636 (94.2%)
1 : 39 ( 5.8%)
0
(0.0%)
any_anyaca_inicio_2014-19
[integer]
Min : 0
Mean : 0.6
Max : 1
0 : 264 (39.1%)
1 : 411 (60.9%)
0
(0.0%)
any_anyaca_inicio_2020-25
[integer]
Min : 0
Mean : 0.3
Max : 1
0 : 450 (66.7%)
1 : 225 (33.3%)
0
(0.0%)
pred_rf
[factor]
1. 1
2. 2
3. 3
4. 4
0 ( 0.0%)
0 ( 0.0%)
0 ( 0.0%)
675 (100.0%)
0
(0.0%)
etiqueta
[character]
1. dissatisfied 675 (100.0%) 0
(0.0%)
2.4.11.1.1 Comparación y justificación de resultados: clasificación vs. predicción.

Se compara la proporción de cada categoría en el juego de datos original de la clasificación y de la predicción en base a las características principales de los perfiles:

# Comparación clasificación-predicción
comparacion = data.frame(
  perfil = c('dropout',
             'dropout',
             'common_graduate',
             'common_graduate',
             'motivated',
             'motivated',
             'dissatisfied',
             'dissatisfied'
             ),
    método = c('clasificación',
               'predicción',
               'clasificación',
               'predicción',
               'clasificación',
               'predicción',
               'clasificación',
               'predicción'
             ),
  "proporción" = c(paste0(nrow(perfil_1),
                          " (", round(100*nrow(perfil_1)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_1_pre),
                          " (", round(100*nrow(perfil_1_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_2),
                          " (", round(100*nrow(perfil_2)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_2_pre),
                          " (", round(100*nrow(perfil_2_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_3),
                          " (", round(100*nrow(perfil_3)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_3_pre),
                          " (", round(100*nrow(perfil_3_pre)/nrow(rto_progreso), 2), "%)"),
                   
                   paste0(nrow(perfil_4),
                          " (", round(100*nrow(perfil_4)/nrow(rto_fin_abandono), 2), "%)"),
                   
                   paste0(nrow(perfil_4_pre),
                          " (", round(100*nrow(perfil_4_pre)/nrow(rto_progreso), 2), "%)")
              ),
  't_rec' = comparacion_item('t_rec'),
  # 't_sup_req' = comparacion_item('t_sup_req'),
  # 'titulado' = comparacion_item('titulado'),
  # 'n_nodos_fin_titulacion' = comparacion_item('n_nodos_fin_titulacion'),
  'nota_media' = comparacion_item('nota_media'),
  'tasa_eficiencia' = comparacion_item('tasa_eficiencia'),
  't_exito' = comparacion_item('t_exito'),
  't_evaluacion' = comparacion_item('t_evaluacion'),
  'sa_asig_participacion' = comparacion_item('sa_asig_participacion'),
  'sa_asig_docente' = comparacion_item('sa_asig_docente'),
  'sa_asig_aprendiendo' = comparacion_item('sa_asig_aprendiendo'),
  'sa_curso_participacion' = comparacion_item('sa_curso_participacion'),
  'sa_curso_titulacion' = comparacion_item('sa_curso_titulacion')
)

comparacion_t = data.frame(t(comparacion[-1]))
# Añadimos los nombres de las columnas
colnames(comparacion_t) = comparacion[, 1]

# se muestran resultados
datatable(comparacion_t)
# se exportan resultados a latex
# print(xtable(comparacion_t), include.rownames = TRUE)
# Comparación clasificación
comparacion = data.frame(
  perfil = c('dropout',
             'common_graduate',
             'motivated',
             'dissatisfied'
             ),
    método = c('clasificación',
               'clasificación',
               'clasificación',
               'clasificación'
             ),
  "proporción" = c(paste0(nrow(perfil_1),
                          " (", round(100*nrow(perfil_1)/nrow(rto_fin_abandono), 2), "%)"),
                                      
                   paste0(nrow(perfil_2),
                          " (", round(100*nrow(perfil_2)/nrow(rto_fin_abandono), 2), "%)"),
                                      
                   paste0(nrow(perfil_3),
                          " (", round(100*nrow(perfil_3)/nrow(rto_fin_abandono), 2), "%)"),
                                      
                   paste0(nrow(perfil_4),
                          " (", round(100*nrow(perfil_4)/nrow(rto_fin_abandono), 2), "%)")
              ),
  't_rec' = comparacion_item('t_rec'),
  # 't_sup_req' = comparacion_item('t_sup_req'),
  # 'titulado' = comparacion_item('titulado'),
  # 'n_nodos_fin_titulacion' = comparacion_item('n_nodos_fin_titulacion'),
  'nota_media' = comparacion_item('nota_media'),
  'tasa_eficiencia' = comparacion_item('tasa_eficiencia'),
  't_exito' = comparacion_item('t_exito'),
  't_evaluacion' = comparacion_item('t_evaluacion'),
  'sa_asig_participacion' = comparacion_item('sa_asig_participacion'),
  'sa_asig_docente' = comparacion_item('sa_asig_docente'),
  'sa_asig_aprendiendo' = comparacion_item('sa_asig_aprendiendo'),
  'sa_curso_participacion' = comparacion_item('sa_curso_participacion'),
  'sa_curso_titulacion' = comparacion_item('sa_curso_titulacion')
)

comparacion_t = data.frame(t(comparacion[-1]))
# Añadimos los nombres de las columnas
colnames(comparacion_t) = comparacion[, 1]


# se exportan resultados a latex
print(xtable(comparacion_t), include.rownames = TRUE)


comparacion_item = function(x){
  resultados = c(paste0(#'Mean (sd): ',
                        round(mean(perfil_1_pre[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_1_pre[[x]], na.rm=TRUE), 1),')'),
                 paste0(#'Mean (sd): ',
                        round(mean(perfil_2_pre[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_2_pre[[x]], na.rm=TRUE), 1),')'), 
                 paste0(#'Mean (sd): ',
                        round(mean(perfil_3_pre[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_3_pre[[x]], na.rm=TRUE), 1),')'), 
                 paste0(#'Mean (sd): ',
                        round(mean(perfil_4_pre[[x]], na.rm=TRUE), 1),
                        ' (', round(sd(perfil_4_pre[[x]], na.rm=TRUE), 1),')')
               )
  
  return(resultados)
}
# Comparación predicción
comparacion = data.frame(
  perfil = c('dropout',
             'common_graduate',
             'motivated',
             'dissatisfied'
             ),
    método = c('predicción',
               'predicción',
               'predicción',
               'predicción'
             ),
  "proporción" = c(paste0(nrow(perfil_1_pre),
                          " (", round(100*nrow(perfil_1_pre)/nrow(rto_progreso), 2), "%)"),
                                      
                   paste0(nrow(perfil_2_pre),
                          " (", round(100*nrow(perfil_2_pre)/nrow(rto_progreso), 2), "%)"),
                                      
                   paste0(nrow(perfil_3_pre),
                          " (", round(100*nrow(perfil_3_pre)/nrow(rto_progreso), 2), "%)"),
                                      
                   paste0(nrow(perfil_4_pre),
                          " (", round(100*nrow(perfil_4_pre)/nrow(rto_progreso), 2), "%)")
              ),
  't_rec' = comparacion_item('t_rec'),
  # 't_sup_req' = comparacion_item('t_sup_req'),
  # 'titulado' = comparacion_item('titulado'),
  # 'n_nodos_fin_titulacion' = comparacion_item('n_nodos_fin_titulacion'),
  'nota_media' = comparacion_item('nota_media'),
  'tasa_eficiencia' = comparacion_item('tasa_eficiencia'),
  't_exito' = comparacion_item('t_exito'),
  't_evaluacion' = comparacion_item('t_evaluacion'),
  'sa_asig_participacion' = comparacion_item('sa_asig_participacion'),
  'sa_asig_docente' = comparacion_item('sa_asig_docente'),
  'sa_asig_aprendiendo' = comparacion_item('sa_asig_aprendiendo'),
  'sa_curso_participacion' = comparacion_item('sa_curso_participacion'),
  'sa_curso_titulacion' = comparacion_item('sa_curso_titulacion')
)

comparacion_t = data.frame(t(comparacion[-1]))
# Añadimos los nombres de las columnas
colnames(comparacion_t) = comparacion[, 1]


# se exportan resultados a latex
print(xtable(comparacion_t), include.rownames = TRUE)

Se considera que los resultados obtenidos en la predicción de la clasificación de estudiantes en progreso están justificados. Como se ha podido comprobar, hay características de los egresados que definen en gran medida su clasificación y asignación a una etiqueta (por ello, es normal que se haya clasificado al 30.84% del estudiantado en progreso como common_graduate). Al haber optado por aplicar la clasificación en 4 clusters (que divide a los egresados en 3 grupos), hay características que los estudiantes en curso aún no tienen (ni pueden tener) porque no han egresado y son clave en la identificación de su cluster. Esto justifica la variación en proporción de cada agrupación con la clasificación de estudiantes en progreso y cómo la predicción eleva la proporción de estudiantes en riesgo de abandono (59.59%) respecto a la obtenida hasta el momento (25.09%).

El principal beneficio que reporta esta clasificación es la identificación de estudiantes que se encuentran en riesgo de abandono (59.59%) y sobre los que habría que actuar, si no se está haciendo ya, para mitigar dicho riesgo.

2.4.11.2 Conclusiones obtenidas de las técnicas de aprendizaje supervisadas.

Se obtienen las siguientes conclusiones:

  • Seleccionar el algoritmo de clasificación multiclase adecuado es un factor principal en los problemas de clasificación.

  • La mayor fiabilidad del proceso se obtiene aplicando un juego de datos normalizado mediante la función scale para que las variables tengan media 0 y desviación típica 1 para que todas las variables aportan la misma importancia. Para poder agrupar los datos, es necesario no tener datos ausentes.

  • Es necesario probar y comparar el comportamiento de diferentes algoritmos (y ajustar sus parámetros) para escoger el más adecuado según la bondad del modelo sobre el grupo de test (a mayor valor, mayor calidad) y la matriz de confusión.

  • Para evitar el overfitting se debe aplicar 10-Fold-Cross-Validation, seleccionando el que tenga mayor precisión y menor error promedio.

Por último, en el caso del ejemplo concreto, ha quedado de manifiesto que el algoritmo con mejores resultados y que no reporta overfitting es Random Forest. En cuanto a los resultados obtenidos en la predicción de la clasificación de estudiantes en progreso, se considera adecuada la diferencia de proporción de los grupos y se considera positivo la identificación de estudiantes en riesgo de abandono para poder implementar acciones que mitiguen el riesgo.

2.5 Fase V. Evaluation o evaluación (obtención de resultados).

Como ha podido comprobarse en la Fase anterior, una vez obtenidos y analizados los resultados del primer modelo ha sido necesario realizar ajustes (excluyendo las variables relacionadas con el egreso/abandono de los estudiantes) para obtener el mejor modelo sobre el que se realiza la evaluación definitiva.

Como ha podido comprobarse, la proporción de resultados en la predicción experimenta:

  • la máxima variación en los perfiles dropout, incrementándose (del 25.09% al 59.59%) y common_graduate, disminuyendo (del 59.59% al 30.84%);
  • mientras que el perfil dissatisfied se asemeja más a la clasificación (del 6.55% al 8.45%);
  • y se identifican, en menor medida, motivated (del 8.76% al 1.11%).

El principal interés es identificar a los estudiantes en progreso que se encuentran en riesgo de abandono, por lo que la evaluación de los resultados obtenidos aportaría información adicional a la que ya utiliza el Departamento de Atención y Orientación al Estudiante (DAOE) de la Udima según los resultados obtenidos en el Servicio de Prevención del Abandono (SPA). La principal diferencia que aporta este modelo frente a los ya utilizados en SPA es la integración de información procedente de los estudios de satisfacción e inserción laboral realizados al estudiantado.

2.5.1 Limitaciones y riesgos de los datos.

En los juegos de datos utilizados se han encontrado las siguientes limitaciones que han dado lugar a una definición no homogénea del perfil de ciertos estudiantes:

  • las variables de utilización de la plataforma de formación moodle (dias_laborable, dias_festivo, horario_madrugada, horario_mañana, horario_tarde, horario_noche) están limitadas a los cursos “2012-13” a “2020-21”;

  • las variables que provienen de los estudios de satisfacción o de inserción laboral no son constantes en el tiempo:

    • el histórico de resultados de satisfacción de estudiantes con las asignatura integra datos desde el curso “2012-13”;
    • el histórico de resultados de satisfacción de estudiantes con el curso integra datos desde el curso “2017-18”, que es cuando se inició el estudio.
    • el histórico de resultados de satisfacción de egresados con la titulación integra datos desde el curso “2009-10”, que es cuando se inició el estudio. Se considera una limitación menor ya que el primer curso en el que se impartió docencia fue “2008-09”;
    • el histórico de resultados de inserción laboral de egresados integra datos desde el curso “2017-18”, que es cuando se inició el estudio. Se considera una limitación menor ya que el primer curso en el que se impartió docencia fue “2008-09”.
  • las variables que se han convertido a dicotómicas (acceso, il_motivo_estudios, il_consecuencia_estudios) o no se han tenido en consideración (plan_estudios) puede que aporten información sustancial de comportamientos del estudiantado que pueden ser evaluados en futuros proyectos.

  • las técnicas de procesamiento del lenguaje natural NLP (con el diccionario de léxico NRC) aplicadas para extraer la connotación negativa o positiva de los comentarios expresados por los usuarios en las distintas encuestas de satisfacción o estudios de inserción laboral no siempre aportan un valor adecuado asociado al rango -1:1 (donde -1 se corresponde con la máxima connotación negativa y 1 positiva). El Léxico de Sentimientos NRC calcula el valor numérico asociado a los unigramas (tokens) del comentario, evaluándolos de manera aislada por lo que algunos términos pueden ser calificados como positivos cuando en conjunto tienen una carga negativa (p.e. la técnica evaluaría ‘bien desilusionado’ como neutro al analizar por separado la connotación de las palabras: bien, positiva y desilusionado, negativa cuando bien está enfatizando la negatividad), o por ejemplo, las ironías o metáforas que pueden realizarse en este tipo de comentarios no son correctamente evaluadas, obteniendo valoraciones que no se corresponden con el contenido o connotación real del comentario.

Como se ha comprobado, la predicción de la clasificación de estudiantes en progreso se realiza con variables relevantes que no dependen del egreso u abandono de los estudiantes, para que la predicción de los estudiantes en progreso no se vea condicionada por dichas características.

Se considera que la baja participación en las encuestas es una limitación, lo que ha conllevado a la imputación de la mediana (métrica robusta a los outliers) en los ítems (variables) a valorar y en la participación de las encuestas sobre las asignaturas y el curso (no así en el caso de las encuestas de satisfacción con la titulación y la inserción laboral, donde se ha imputado 0).

2.6 Fase VI. Deployment o despliegue (puesta en producción).

En esta fase, dado que es un posible proyecto real que dependería de la planificación e intereses de la organización, su puesta en producción no se evaluaría en el alcance del presente estudio. No obstante, vistas las limitaciones anteriores y en caso de la implementación del modelo, se tratarían de minimizar para obtener los mejores resultados posibles y optimizar así los beneficios de su implementación.

En este caso, se revisaría si es necesario realizar ajustes desde la Fase I a la V del presente proyecto para valorar de nuevo los beneficios de su aplicación.

La planificación del despliegue del modelo, detallando cuándo se revisará y mantendrá, así como la comprobación de su correcta aplicación queda fuera del alcance del presente proyecto.


3 Fuentes.


3.1 Asignaturas del máster con mayor aplicación en el proyecto.

3.2 Bibliografía y material adicional consultado.